当前位置:编程学习 > C/C++ >>

C语言合并链表的问题

#include<stdio.h>
#include<malloc.h>

typedef struct lnode {
int data;
struct lnode *next;
}lnode,*linklist;


linklist creatlist(int m)//创建链表
{
linklist p,l,s;
int i;
p=l=(linklist)malloc(sizeof(lnode));
p->next=NULL;
printf("请输入链表中的一个数字:");
scanf("%d",&p->data);

for(i=2;i<=m;i++)
{
s=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数字",i);
scanf("%d",&s->data);

p->next=s;
p=p->next;
}
return l;
}
void print(linklist h)//打印链表
{
linklist p=h->next;
int t=1;
printf("打印各个数字:\n");

do
{
printf("请输出第%d个数:",t);
printf("%d\n",p->data);
p=p->next;
t++;
}while(p);
}

linklist mergelist(void)//两个链表合并
{

int e,n;
linklist pa,pb,pc,head;
printf("请输入第一个链表的长度:");
scanf("%d",&e);
pa=creatlist(e);
printf("请输入第二个链表的长度:");
scanf("%d",&n);
pb=creatlist(n);

head=pc=(linklist)malloc(sizeof(lnode));
pc->next=NULL;


while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;

pb=pb->next;
}
else
{
pc->next=pb;
pc=pb;

pa=pa->next;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
return head;
}

void main()
{
linklist head;
head=mergelist();
print(head);
}

编译没问题. 但是运行出错.

答案:两个问题. 下面的程序通过测试. 附图.

/*创建两个链表,并将两个链表中的数按从小到大合并成一个链表,输出*/
#include<stdio.h>
#include<malloc.h>

typedef struct lnode {
int data;
struct lnode *next;
}lnode,*linklist;


linklist creatlist(int m)//创建链表
{
linklist p,l,s;
int i;
p=l=(linklist)malloc(sizeof(lnode));
p->next=NULL;
printf("请输入链表中的一个数字:");
scanf("%d",&p->data);

for(i=2;i<=m;i++)
{
s=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数字",i);
scanf("%d",&s->data);

p->next=s;
p=p->next;
}
p->next=NULL; //问题1:链表尾指针置空.
printf("\n");
return l;


}
void print(linklist h)//打印链表
{
linklist p=h->next;
int t=1;
printf("打印各个数字:\n");

do
{
printf("请输出第%d个数:",t);
printf("%d\n",p->data);
p=p->next;
t++;
}while(p);
}

linklist mergelist(void)//两个链表合并
{
int e,n;
linklist pa,pb,pc,head;
printf("请输入第一个链表的长度:");
scanf("%d",&e);
pa=creatlist(e);
printf("请输入第二个链表的长度:");
scanf("%d",&n);
pb=creatlist(n);

head=pc=(linklist)malloc(sizeof(lnode));
pc->next=NULL;

while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next; //问题2:排序
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next; //同上.
}
}
pc->next=pa?pa:pb;
return head;
}

void main()
{
linklist head;
head=mergelist();
print(head);
}


linklist creatlist(int m)//创建链表
{
linklist p,l,s;
int i;
p=l=(linklist)malloc(sizeof(lnode));
p->next=NULL;
printf("请输入链表中的一个数字:");
scanf("%d",&p->data);

for(i=2;i<=m;i++)
{
s=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数字",i);
scanf("%d",&s->data);

p->next=s;
p=p->next;
}

//问题出在这里了
p->next=NULL;
return l;
}

创建链表的时候 最后一个节点的指针需要置空

不然后面遍历的时候就没有循环跳出条件了哦

典型的访问内存越界

上一个:C语言问题,求解
下一个:C语言的四个程序

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,