#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef struct Lnode{
int data; //数据域
struct Lnode *next; //指针域
}Lnode,*Linklist; //*Linklist为Lnode类型的指针
int CreateList(Linklist L,int n) //头插法
{
Linklist p,q;
p = L;//第一步,取到头结点,两个指针指向同一内存,改变p指向的内存,L指向的内存不变,L仍为头结点
printf("请输入%d个数:\n", n);
for (int i = 1; i <= n; i++)
{
q = (Linklist)malloc(sizeof(int));
if (!p)
{
printf("p的初始化出现问题!\n");
return 0;
}
scanf("%d", &q->data);
q->next = p->next;//第二步链接两个结点
p->next = q;//第二步链接两个结点
p = q;//关键的一步,更换位置,进行下次循环
}
return 1;
}
int getLinklist(Linklist L,int a){ //打印链表
int n=a;
if(!L->next)
{
printf("链表没有节点,不能输出");
return 0;
}
Linklist p;
p=L->next;
for(int i=0;i<n;i++)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}
int MergeList_L(Linklist La, Linklist Lb, Linklist Lc) {
Lnode *pa,*pb,*pc;//按值排序的单链表LA,LB,归并为LC后也按值排序
pa=La->next;
pb=Lb->next;
Lc=pc=La; //初始化 ,用La的头结点作为Lc的头结点
while(pa && pb) //将pa ,pb结点按大小依次插入C中
{
if(pa->data <= pb->data)
{
pc->next=pa;//把La插入到Lc后面,此时Lc位于倒数第二个节点
pc=pa;//把pc往后移让pc始终指向最后一个节点
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb; //插入剩余段
free(Lb);//释放Lb的头结点
return Lc;
} //MergeList_L ,O(n1+n2)
int main()
{
int a,b,sum=0;
Linklist *La=(Linklist*)malloc(sizeof(Lnode));
Linklist *Lb=(Linklist*)malloc(sizeof(Lnode));
Linklist *Lc=(Linklist*)malloc(sizeof(Lnode));
printf("请问您想给表La输入几个数:");
scanf("%d",&a);
CreateList(La,a);
sum+=a;
printf("请问您想给表Lb输入几个数:");
scanf("%d",&b);
CreateList(Lb,b);
sum+=b;
MergeList_L(La,Lb,Lc);
getLinklist(Lc,sum);
return 0;
}
我很好奇你的代码是如何运行起来的。
Linklist *La = (Linklist*)malloc(sizeof(Lnode));
Linklist *Lb = (Linklist*)malloc(sizeof(Lnode));
Linklist *Lc = (Linklist*)malloc(sizeof(Lnode));
这里定义的是二级指针。
但是函数参数是一级指针。
int CreateList(Linklist L, int n) //头插法
int MergeList_L(Linklist La, Linklist Lb, Linklist Lc)