c语言单链表合并占据原本,两单链表合并后,为什么原链表被改变了。。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#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);

}

e80675175c56cfda5f3804b258b76858.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值