该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//正序输出单链表
void OutputList(LinkList L)
{
while(L->next)
{
L=L->next;
printf("%d ",L->data);
}
printf("\n\n");
}
//尾插法创建链表
LinkList List_TailInsert(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode *p,*r=L;
int x;
scanf("%d",&x);
while(x!=9999)
{
p=(LNode*)malloc(sizeof(LNode));
p->data=x;
r->next=p;
r=p;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//合并
LinkList MergeLinkList_Increase(LinkList A,LinkList B,LinkList &C)
{
LNode *p=A->next;
LNode *q=B->next;
LNode *r;
C=(LinkList)malloc(sizeof(LNode));
//C=A;//用A的头结点来做C的头结点,其实用B的也可以,甚至自己新建一个结点也可以。
C->next=NULL;//将A的头结点取下,因为这时C只有头结点,没有这句就相当于C=A了。
r=C;//r指向C(指向C的尾结点),因为现在只有一个结点,头结点即尾结点。
free(B);//因为p指向了B中有数据的第一个结点,所以B头结点没用了,释放。
/*
p、q两个指针分别指向A、B两个链表头结点,取p、q中较小的插入C,
然后读取插入C那个结点的下一个结点,继续和刚才较大的结点比较,
比较和插入一直进行下去,直至一个链表穷尽。
*/
while(p&&q)
{
if(p->data<=q->data)
{
r->next=p;
p=p->next;
r=r->next;
}else{
r->next=q;
q=q->next;
r=r->next;
}
}
r->next=NULL;
/*
当一个链表穷尽时,另一个链表可能还有剩余结点,
并且剩余结点的值递增(因为规定了A、B都是递增的)
而剩余结点的值又一定大于已插入C中结点的值,
所以直接依次插入即可,无需比较。
又因C递增,所以直接将剩下的链表直接链接在C后即可。
*/
if(p)
r->next=p;
if(q)
r->next=q;
return C;
}
int main()
{
LinkList A,B,C;
printf("请输入单链表A元素(输入9999结束接受):");
List_TailInsert(A);
printf("请输入单链表B元素(输入9999结束接受):");
List_TailInsert(B);
printf("A:");
OutputList(A);
printf("B:");
OutputList(B);
printf("C:");
OutputList(MergeLinkList_Increase(A,B,C));
printf("A:");
OutputList(A);
}