#include stdio.h#include stdlib.h/*** 含头节点单链表定义及基本操作 *///基本操作函数用到的状态码 #define TRUE 1;#define FALSE 0;#define OK 1;#define ERROR 0;//Status函数返回值类型typedef in...
#include <stdio.h>
#include <stdlib.h>
/**
* 含头节点单链表定义及基本操作
*/
//基本操作函数用到的状态码
#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;
}
沃梦达教程
本文标题为:单链表的两种合并操作(C语言)
猜你喜欢
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言qsort()函数的使用方法详解 2023-04-26
- Easyx实现扫雷游戏 2023-02-06
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- Qt计时器使用方法详解 2023-05-30
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
