单链表的合并c语言,单链表的两种合并操作(C语言)

#include

#include

/**

* 含头节点单链表定义及基本操作

*/

//基本操作函数用到的状态码

#define TRUE 1;

#define FALSE 0;

#define OK 1;

#define ERROR 0;

//Status函数返回值类型

typedef int Status;

//数据元素类型

typedef int ElemType;

//单链表定义

typedef struct Lnode {

ElemType data; //数据域

struct Lnode *next; //指针域

} Lnode, *LinkList;

//基本操作1:单链表初始化

Status InitList(LinkList *list) {

(*list)=(LinkList)malloc(sizeof(Lnode));

(*list)->next=NULL;

return OK;

}

//基本操作11:头插法建立链表,数据保存在ElemType类型的数组中

Status CreateList_H(LinkList *list,ElemType arrData[],int length) {

int j;

for(j=length-1;j>=0;j--){

//新建结点

Lnode *node;

node=(Lnode*)malloc(sizeof(Lnode));

node->data=arrData[j];

node->next=NULL;

//插入为1号结点

node->next=(*list)->next;

(*list)->next=node;

}

return OK;

}

//基本操作13:链表元素遍历输出

Status ListTraverse(LinkList list) {

Lnode *p;

p=list;

int j=0;

printf("序号: 结点数据:\n");

while(p->next){

j++;

p=p->next;

printf(" (%d) %d\n",j,p->data);

}

return OK;

}

//有序表合并,顺序表实现。pa,pb分别指向listA,listB首元,pc指向新链表表尾

Status MergeList(LinkList *listA,LinkList *listB) {

Lnode *pa,*pb,*pc;

pa=(*listA)->next;

pb=(*listB)->next;

pc=*listA;

while(pa&&pb){

if(pa->data<=pb->data){

pc->next=pa;

pc=pa;

pa=pa->next;

} else {

pc->next=pb;

pc=pb;

pb=pb->next;

}

}

//插入剩余表段

pc->next=pa?pa:pb;

//释放listB头结点

free(*listB);

return OK;

}

//线性表合并,顺序表实现。pa,pb分别指向listA,listB首元

Status UnionList(LinkList *listA,LinkList *listB){

Lnode *pa,*pb; //ra将指向listA尾结点

pa=(*listA);

pb=(*listB);

while(pb->next){

ElemType data=pb->next->data;

while(pa->next&&pa->next->data!=data){

pa=pa->next;

}

if(pa->next&&pa->next->data==data){ //listA中有目标元素

Lnode *needDelete=pb->next;

pb->next=needDelete->next;

free(needDelete); //释放listB中的该结点

} else {

Lnode *needInsert=pb->next; //pb->next指向当前结点

//将该结点接入listA尾

pa->next=needInsert; //此时pa为listA的尾指针

pb->next=pb->next->next;

needInsert->next=NULL; //listA的 最后结点->next 置空

}

pa=(*listA)->next;

}

free(*listB); //释放listB头结点

return OK;

}

/**

* 已知线性表:

* list1=(1,7,8),list2=(2,4,6,8,10,11)

* 有序表合并:(这里为两个非递减线性表list1,list2;合并为一个非递减线性表,仍作为list1);

* 则新的:list1=(1,2,4,6,7,8,8,10,11)

* 线性表合并:(合并结果放入list1,“list1 并= list2”)

* 则新的:list1=(1,7,8,2,4,6,10,11)

*/

int main(void){

//定义链表

LinkList list1,list2,list3,list4;

//链表初始化

InitList(&list1);

InitList(&list2);

InitList(&list3);

InitList(&list4);

//创建链表

ElemType waitInserted1[]={1,7,8,};

ElemType waitInserted2[]={2,4,6,8,10,11,};

ElemType waitInserted3[]={1,7,8,};

ElemType waitInserted4[]={2,4,6,8,10,11,};

int arrLength1=sizeof(waitInserted1)/sizeof(waitInserted1[0]);

int arrLength2=sizeof(waitInserted2)/sizeof(waitInserted2[0]);

int arrLength3=sizeof(waitInserted3)/sizeof(waitInserted3[0]);

int arrLength4=sizeof(waitInserted4)/sizeof(waitInserted4[0]);

CreateList_H(&list1,waitInserted1,arrLength1);

CreateList_H(&list2,waitInserted2,arrLength2);

CreateList_H(&list3,waitInserted3,arrLength3);

CreateList_H(&list4,waitInserted4,arrLength4);

/*

printf("\nlist1:\n");

ListTraverse(list1);

printf("\nlist2:\n");

ListTraverse(list2);

printf("\nlist3:\n");

ListTraverse(list4);

printf("\nlist3:\n");

ListTraverse(list4);

*/

//有序表合并

MergeList(&list1,&list2);

printf("\nlist1:(与list2经过有序表合并后)\n");

ListTraverse(list1); //遍历测试

//线性表合并

UnionList(&list3,&list4);

printf("\nlist3:(与list4经过线性表表合并后)\n");

ListTraverse(list3); //遍历测试

printf("\nEND");

return 0;

}

标签:单链,Lnode,list1,合并,next,pb,pa,C语言,listA

来源: https://www.cnblogs.com/petitepluie/p/14545383.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值