合并两个链表,可是运行不通过耶~请各位高手帮忙看看错在哪里?
#include "stdio.h"#include "malloc.h"
struct node
{
int data;
struct node *next;
};
struct node * creat(void)
{
struct node *p1,*p2,*head;
p2=p1=(struct node *)malloc(sizeof(struct node));
scanf("%d",&p1->data);
head=p1;
while(p1->data!=NULL)
{
p1=(struct node *)malloc(sizeof(struct node));
scanf("%d",&p1->data);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
return(head);
}
struct node * print(struct node *head)
{
struct node *p; int sum=0;
printf("the data of the list are:\n");
p=head;
while(p->next!=NULL)
{
printf("%d ",p->data);
p=p->next;sum++;
}
}
struct node * connect(struct node *hx,struct node *hy)
{
struct node *p,*hz;
p=hx;
while(p->next!=NULL)
p=p->next;
p->next=hy;
hz=hx;
return(hz);
}
main()
{
struct node *hx,*hy,*hz;
printf("please enter the data of X");
hx=creat();
print(hx);
printf("please enter the data of Y");
hy=creat();
print(hy);
hz=connect(hx,hy);
print(hz);
}
----------------解决方案--------------------------------------------------------
你上次发的那个链表的帖子问题解决了吗?
----------------解决方案--------------------------------------------------------
// 送你段代码 //
//----------------------------------------------------
// 在链表中顺序插入节点
// DEV-C++ 编译通过,并测试无错,如果有错发消息给我
//----------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int iData;
struct Node * pNext;
} * List, Node;
List InitializeList(void); // 初始化列表
int InsertNode(List * pList, int iNewData); // 从小到大插入插入数据
int ShowList(List * pList); // 显示列表
void DelList(List * pList); // 删除列表
//----------------------------------------------------
int main(void)
{
List lobj;
int data;
lobj = InitializeList();
// ShowList(&lobj);
printf(" 请输入一组int数据,每个数据之间用空格分开,\n"
"并一个非数字字符结束输入。\n");
while(scanf("%d", &data) == 1)
InsertNode(&lobj, data);
ShowList(&lobj);
DelList(&lobj);
system("Pause");
return 0;
}
//----------------------------------------------------
List InitializeList(void) // 初始化列表
{
return NULL;
}
int InsertNode(List * pList, int iNewData) // 从小到大插入插入数据
{
Node * pCurNode; // 指向当前节点
Node * pPreNode; // 指向前一个节点
Node * pNewNode; // 指向新创建的节点
pPreNode = NULL;
pCurNode = *pList;
pNewNode = (Node *)malloc(sizeof(Node)); // 创建一个新节点
if(pNewNode == NULL) // 新节点创建失败
return 0;
pNewNode->iData = iNewData; // 把数据放入该节点
while(pCurNode != NULL && pCurNode->iData <= iNewData)
{
pPreNode = pCurNode;
pCurNode = pCurNode->pNext;
}
pNewNode->pNext = pCurNode; // 把比 iNewData (数据)大的节点放在新节点后
if(pPreNode == NULL) // 列表为空,或在第一个数据前
{
*pList = pNewNode;
}
else // 列表中,或列结尾
{
pPreNode->pNext = pNewNode;
}
return 1;
}
int ShowList(List * pList) // 显示列表
{
int count = 0; // 节点个数
Node * pCurNode; // 指向当前节点
pCurNode = *pList; // 指向第一个节点
while(pCurNode != NULL)
{
++count;
printf("%d ", pCurNode->iData);
pCurNode = pCurNode->pNext;
}
if(count == 0)
printf("\n列表中无数据!\n");
putchar('\n');
return count;
}
void DelList(List * pList) // 删除列表(删除所有节点)
{
Node * pCurNode; // 指向当前节点
Node * pTempNode; // 临时节点指针
pCurNode = *pList; // 指向第一个节点
while(pCurNode != NULL)
{
pTempNode = pCurNode->pNext;
free(pCurNode);
pCurNode = pTempNode;
}
*pList = NULL;
}
----------------解决方案--------------------------------------------------------
while(p1->data != NULL) 为何有这个?
----------------解决方案--------------------------------------------------------
/* 只写了一个合并函数 */
struct node * connect(struct node * a, struct node * b)
{
struct node * p = a;
if(a == NULL) // 链表a为空
{
a = b;
}
else if(b != NULL) // 链表b不为空
{
while(p->next != NULL)
p = p->next;
p->next = b;
}
return a;
}
如果链表a 为空,则返回链表b 。
如果链表b 为空,就不需要把链表b添加到链表a 的尾部,
所以只有在链表b 不为空的情况下才需要把链表b 添加到链表a 的尾部。
[[it] 本帖最后由 cosdos 于 2008-4-6 13:57 编辑 [/it]]
----------------解决方案--------------------------------------------------------
创建链表最好使用一个“添加新节点的函数”,每输入一个数字,就插入一个新节点。直到链表满或者输入了表示输入终止的终止符。输入第一个数字时链表为空(NULL),通过添加新节点的函数把新节点添加到链表中。
这样程序就能够更加灵活。
可以用一种抽象的数据表示方法 ADT,其实就是操作链表的函数。就像使用printf() 函数那样,你并不需要知道它如果实现的,只要知道它如何使用。printf()操作的是stdout (标准输出, 类型是 FILE *)。
----------------解决方案--------------------------------------------------------
while(p1->data != NULL) // 用这个结束输入并合适
while(p1->data != 0) // 用这个吧
[[it] 本帖最后由 cosdos 于 2008-4-6 13:51 编辑 [/it]]
----------------解决方案--------------------------------------------------------
// 5楼代码居然写错了,失误
struct node * connect(struct node * a, struct node * b)
{
struct node * p = a;
if(a == NULL) // 链表a为空
{
a = b;
}
else if(b != NULL) // 链表b不为空
{
while(p->next != NULL)
p = p->next;
p->next = b;
}
return a;
}
----------------解决方案--------------------------------------------------------
// creat() 函数修正 //
struct node * creat(void)
{
struct node *pcur, *pnew, *head;
head = pnew = (struct node *)malloc(sizeof(struct node));
scanf("%d", &pnew->data);
if(pnew->data == 0)
{
free(pnew);
head = NULL;
}
else
{
while(pnew->data != 0)
{
pcur = pnew;
pnew = (struct node *)malloc(sizeof(struct node));
scanf("%d", &pnew->data);
pcur->next = pnew;
}
if(pnew->data == 0)
{
free(pnew);
pcur->next = NULL;
}
}
pcur->next = NULL;
return head;
}
// 5楼代码居然写错了,失误 // connect()函数修正
struct node * connect(struct node * a, struct node * b)
{
struct node * p = a;
if(a == NULL) // 链表a为空
{
a = b;
}
else if(b != NULL) // 链表b不为空
{
while(p->next != NULL)
p = p->next;
p->next = b;
}
return a;
}
// print() 函数修正
int print(struct node * p)
{
int sum = 0;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
sum++;
}
putchar('\n');
return sum;
}
----------------解决方案--------------------------------------------------------
整个程序就是个错误。
函数都有问题。
改写的函数中还可以加入对malloc()函数分配内存是否成功作判断。
----------------解决方案--------------------------------------------------------