线性表之单链表求集合并集
学习目标:
掌握以下内容 1、单链表的创建 2、将数据插入单链表 3、单链表合并 4、单链表去重
学习时间:
2020/10/20
学习产出:
技术博客 1 篇 哔哩哔哩专栏1篇
文章目录
线性表之单链表求集合并集学习目标:学习时间:学习产出:一、自定义结构体二、初始化单链表三、单链表长度测量四、 在第i个位置插入结点五、单链表排序(递增)六、单链表去除重复元素五、两个链表并集六、输出单链表七、主函数八、调用函数库九、运行结果
一、自定义结构体
typedef char elem
;
typedef struct LNode
{
elem data
;
struct LNode
*next
;
}Lnode
;
二、初始化单链表
int InitList(Lnode
*&L
)
{
L
=(Lnode
*)malloc(sizeof(Lnode
));
if(L
== NULL)
{
printf("申请分配内存空间失败\n");
return 0;
}
L
-> next
= NULL;
return 1;
}
三、单链表长度测量
int LinkList_Length(Lnode
*L
)
{
Lnode
*p
;
p
= L
;
int j
= 0;
while(p
-> next
!= NULL)
{
p
= p
-> next
;
j
++;
}
return j
;
}
四、 在第i个位置插入结点
bool InsertAfter_Linklist(Lnode
*&L
, elem x
, int i
)
{
Lnode
*p
, *s
;
int n
;
n
= LinkList_Length(L
);
if (i
<= 0)
{
printf("插入位置错误\n");
return false;
}
if(i
> n
+1)
{
printf("插入位置错误\n");
return false;
}
p
= L
;
int j
;
for(j
= 0; p
&& j
< i
- 1; j
++)
p
= p
-> next
;
s
= (Lnode
*)malloc(sizeof(Lnode
));
if(s
== NULL)
return false;
s
-> data
= x
;
s
-> next
= p
-> next
;
p
-> next
= s
;
return true;
}
}
五、单链表排序(递增)
void list_sort(Lnode
*&L
)
{
Lnode
*p
= L
->next
;
int temp
, i
, j
, num
;
num
= LinkList_Length(L
);
for(i
=0;i
<num
-1;i
++)
{
p
= L
->next
;
for( j
=0;j
<num
-i
-1;j
++)
{
if(p
->data
> p
->next
->data
)
{
temp
= p
->data
;
p
->data
= p
->next
->data
;
p
->next
->data
= temp
;
}
p
= p
->next
;
}
}
}
六、单链表去除重复元素
void Del_Sam(Lnode
*L
)
{
Lnode
*p1
, *p2
;
p1
= L
-> next
;
p2
= p1
-> next
;
while(p2
)
{
if(p1
-> data
!= p2
-> data
)
{
p1
-> next
= p2
;
p1
= p2
;
p2
= p2
-> next
;
}
else
{
p2
= p2
-> next
;
}
}
p1
-> next
= NULL;
}
五、两个链表并集
Lnode
* Mesh_LinkLists(Lnode
*L1
, Lnode
*L2
)
{
Lnode
*p1
, *p2,
*L3
;
InitList(L3
);
if(!L1
)
{
L1
= L2
;
return L3
;
}
int i
= 1;
p1
= L1
-> next
;
p2
= L2
-> next
;
while(p1
&& p2
)
{
if(p1
-> data
<= p2
-> data
)
{
InsertAfter_Linklist(L3
, p1
-> data
, i
++);
p1
= p1
-> next
;
}
else
{
InsertAfter_Linklist(L3
, p2
-> data
, i
++);
p2
= p2
-> next
;
}
}
while(p1
)
{
InsertAfter_Linklist(L3
, p1
-> data
, i
++);
p1
= p1
-> next
;
}
while(p2
)
{
InsertAfter_Linklist(L3
, p2
-> data
, i
++);
p2
= p2
-> next
;
}
Del_Sam(L3
);
return L3
;
}
六、输出单链表
void Print_LinkList(Lnode
*L
)
{ LNode
*p
=L
->next
;
while (p
!=NULL)
{ printf("%c ",p
->data
);
p
=p
->next
;
}
printf("\n");
}
七、主函数
#include "Linklist.cpp"
int main()
{
elem A
[10] = {'c','a','e','h'};
elem B
[10] = {'f','h','b','g','d','a'};
int i
;
Lnode
*L1
, *L2
, *L3
;
InitList(L1
);
InitList(L2
);
for(i
= 0; A
[i
]; i
++)
{
InsertAfter_Linklist(L1
,A
[i
], i
+1);
}
for(i
= 0; B
[i
]; i
++)
{
InsertAfter_Linklist(L2
, B
[i
], i
+1);
}
printf("原 集 合A:");
Print_LinkList(L1
);
printf("原 集 合B:");
Print_LinkList(L2
);
list_sort(L1
);
list_sort(L2
);
printf("有序集合A:");
Print_LinkList(L1
);
printf("有序集合B:");
Print_LinkList(L2
);
L3
= Mesh_LinkLists(L1
, L2
);
printf("集合的并C:");
Print_LinkList(L3
);
return 0;
}
八、调用函数库
#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
typedef char elem
;
typedef struct LNode
{
elem data
;
struct LNode
*next
;
}Lnode
;
int InitList(Lnode
*&L
)
{
L
=(Lnode
*)malloc(sizeof(Lnode
));
if(L
== NULL)
{
printf("申请分配内存空间失败\n");
return 0;
}
L
-> next
= NULL;
return 1;
}
int LinkList_Length(Lnode
*L
)
{
Lnode
*p
;
p
= L
;
int j
= 0;
while(p
-> next
!= NULL)
{
p
= p
-> next
;
j
++;
}
return j
;
}
bool InsertAfter_Linklist(Lnode
*&L
, elem x
, int i
)
{
Lnode
*p
, *s
;
int n
;
n
= LinkList_Length(L
);
if (i
<= 0)
{
printf("插入位置错误\n");
return false;
}
if(i
> n
+1)
{
printf("插入位置错误\n");
return false;
}
p
= L
;
int j
;
for(j
= 0; p
&& j
< i
- 1; j
++)
p
= p
-> next
;
s
= (Lnode
*)malloc(sizeof(Lnode
));
if(s
== NULL)
return false;
s
-> data
= x
;
s
-> next
= p
-> next
;
p
-> next
= s
;
return true;
}
void Del_Sam(Lnode
*L
)
{
Lnode
*p1
, *p2
;
p1
= L
-> next
;
p2
= p1
-> next
;
while(p2
)
{
if(p1
-> data
!= p2
-> data
)
{
p1
-> next
= p2
;
p1
= p2
;
p2
= p2
-> next
;
}
else
{
p2
= p2
-> next
;
}
}
p1
-> next
= NULL;
}
void list_sort(Lnode
*&L
)
{
Lnode
*p
= L
->next
;
int temp
, i
, j
, num
;
num
= LinkList_Length(L
);
for(i
=0;i
<num
-1;i
++)
{
p
= L
->next
;
for( j
=0;j
<num
-i
-1;j
++)
{
if(p
->data
> p
->next
->data
)
{
temp
= p
->data
;
p
->data
= p
->next
->data
;
p
->next
->data
= temp
;
}
p
= p
->next
;
}
}
}
Lnode
* Mesh_LinkLists(Lnode
*L1
, Lnode
*L2
)
{
Lnode
*p1
, *p2
, *L3
;
InitList(L3
);
if(!L1
)
{
L1
= L2
;
return L3
;
}
int i
= 1;
p1
= L1
-> next
;
p2
= L2
-> next
;
while(p1
&& p2
)
{
if(p1
-> data
<= p2
-> data
)
{
InsertAfter_Linklist(L3
, p1
-> data
, i
++);
p1
= p1
-> next
;
}
else
{
InsertAfter_Linklist(L3
, p2
-> data
, i
++);
p2
= p2
-> next
;
}
}
while(p1
)
{
InsertAfter_Linklist(L3
, p1
-> data
, i
++);
p1
= p1
-> next
;
}
while(p2
)
{
InsertAfter_Linklist(L3
, p2
-> data
, i
++);
p2
= p2
-> next
;
}
Del_Sam(L3
);
return L3
;
}
void Print_LinkList(Lnode
*L
)
{ LNode
*p
=L
->next
;
while (p
!=NULL)
{ printf("%c ",p
->data
);
p
=p
->next
;
}
printf("\n");
}
九、运行结果
如有错误,敬请斧正