我的unionlist哪里错了?为什么执行不出来??
# include<stdio.h># include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node,*linklist;
void initlist(linklist *L)
{
(*L)=(linklist)malloc(sizeof(Node));
if(!(*L))
{
printf("对不起,初始化失败。\n");
}
else
{
(*L)->next=NULL;
printf("初始化成功。\n");
}
}
void creatlist(linklist L) //尾插法建立单链表
{
int num,i;
linklist r,q;
r=L;
printf("请问你想要建立几个元素的单链表:\n");
scanf("%d",&num);
for(i=0;i<num;i++)
{
q=(linklist)malloc(sizeof(Node));
if(!q)
{
printf("对不起,存储空间分配失败。\n");
}
else
{
printf("请输入第%d个元素:",i+1);
scanf("%d",&q->data);
q->next=NULL;
r->next=q;
r=q;
}
}
printf("单链表创建完毕。\n");
}
void printlist(linklist L)
{
linklist p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("单链表打印完毕。\n");
}
linklist unionlist(linklist L1,linklist L2,linklist L3)
{
linklist p1,p2,p3;
L3=L1;
p1=L1->next;
p2=L2->next;
while(p1&&p2)
{
if(p1->data<=p2->data)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2;
free(L2);
return L3;
}
int main()
{
linklist L1,L2,L3;
printf("请创建第一个链表:");
initlist(&L1);
creatlist(L1); printlist(L1);
printf("请创建第二个链表:");
initlist(&L2);
creatlist(L2); printlist(L2);
printf("合并两个链表:");
unionlist(L1,L2,L3);
printlist(L3);
return 0;
}@人造人 有些警告是有意义的
人造人 发表于 2018-4-18 19:41
有些警告是有意义的
可是我L3已经定义了它的类型啊,我只需要让它在unionlist中指向L1就好了啊,这样不通吗? 楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结点要分配空间的,
你在main函数里定义了L3,要分配给L3链表的空间,也就是要初始化一下
还有你的unionlist函数有返回值,在main函数里就是L3 = unionlist(L1,L2,L3);
还有unionlist里的p3指针要进行初始化,否则就是野指针,
具体见程序注释,我调试过,应该没有错,楼主也可以实验一下
# include<stdio.h>
# include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node, *linklist;
void initlist(linklist *L)
{
(*L) = (linklist)malloc(sizeof(Node));
if (!(*L))
{
printf("对不起,初始化失败。\n");
}
else
{
(*L)->next = NULL;
printf("初始化成功。\n");
}
}
void creatlist(linklist L) //尾插法建立单链表
{
int num, i;
linklist r, q;
r = L;
printf("请问你想要建立几个元素的单链表:\n");
scanf("%d", &num);
for (i = 0; i<num; i++)
{
q = (linklist)malloc(sizeof(Node));
if (!q)
{
printf("对不起,存储空间分配失败。\n");
}
else
{
printf("请输入第%d个元素:", i + 1);
scanf("%d", &q->data);
q->next = NULL;
r->next = q;
r = q;
}
}
printf("单链表创建完毕。\n");
}
void printlist(linklist L)
{
linklist p;
p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("单链表打印完毕。\n");
}
linklist unionlist(linklist L1, linklist L2, linklist L3)
{
linklist p1, p2, p3;
p3 = L3 = L1;//p3这里的指针要初始化,要不就是野指针
p1 = L1->next;
p2 = L2->next;
while (p1&&p2)
{
if (p1->data <= p2->data)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
free(L2);
return L3;
}
int main()
{
linklist L1, L2, L3;
printf("请创建第一个链表:");
initlist(&L1);
creatlist(L1); printlist(L1);
printf("请创建第二个链表:");
initlist(&L2);
creatlist(L2); printlist(L2);
initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化
printf("合并两个链表:");
L3 = unionlist(L1, L2, L3);//这里记得要有返回值。。。
printlist(L3);
return 0;
} 溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...
哇谢谢你!!!!!我明天参考你的程序调试看看~
谢谢!!!!!{:10_298:} 溯影 发表于 2018-4-20 08:57
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结 ...
我按照你给我的提示然后我自己也运行出来啦~{:10_298:}
但是我就是有点不太明白“initlist(&L3);//这句要写上,因为楼上说的有道理的,这里要新建一个链表,分配空间,初始化” 这句语句
我如果理解:我只是要定义一个和L1指向同一个结点的头指针,L1这个头结点已经初始化了,我只是再定义一个类型和它一样的头指针而已,为什么还要再将L3初始化?? 因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点 愿你 发表于 2018-4-23 10:31
我按照你给我的提示然后我自己也运行出来啦~
但是我就是有点不太明白“initlist(&L3);//这句 ...
因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点的,当然要分配空间啦,但是你看你的那个unionlist的函数里一开始声明的那个结点型指针p1,p2,这个就不用分配空间,因为他只是起到指向的作用,并不充当结点 溯影 发表于 2018-4-23 12:00
因为你函数写的是一个返回一个结点型的指针,在函数里面又是写了一个L3的结构体,这个结构体是要存储结点 ...
那我不能理解成L3也只是一个我索引到L1吗{:7_112:}{:10_277:}
页:
[1]