|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- # 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;
- }
复制代码 @人造人
楼上说的有道理,定义了类型还要进行空间的分配哇,要初始化,
楼主要理解指向结点的指针和结点的区别,结点要分配空间的,
你在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;
- }
复制代码
|
|