概述
整数集合用单链表实现存储,实现如下操作:
(1) 初始化集合
(2)插入一个数到集合指定位置
(3)按值删除集合中的元素
(4)按值在集合中进行查找
(5)清空集合
(6)求两个集合的交集
(7)求两个集合的并集
(8)求两个集合的差集
(9)输出集合
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode* next;
}Lnode, * LinkList;
int initList(LinkList* L)
{
(*L) = (LinkList)malloc(sizeof(Lnode));
(*L)->next = NULL;
return 1;
}
int insertList(LinkList L, int i, ElemType e) //最基本的按位序插入
{
LinkList p = L, q;
int pos = 0;
if (p == NULL)
return 0;
while (p->next && pos < i - 1)
{
p = p->next;
pos++;
}
q = (LinkList)malloc(sizeof(Lnode));
q->data = e;
q->next = p->next;
p->next = q;
return 1;
}
int printList(LinkList L) //为了不打乱按位序插入的结果,用普通的方法输出
{
LinkList p = L->next;
if (p == NULL)
return 0;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("n");
return 1;
}
int rearinsertList(LinkList L, ElemType e) //尾插,和排序输出配合使用
{
LinkList p = L, q;
if (p == NULL)
return 0;
while (p->next)
p = p->next;
q = (LinkList)malloc(sizeof(Lnode));
q->data = e;
q->next = NULL;
p->next = q;
return 1;
}
int sortPrintList(LinkList L) //排序输出
{
LinkList p = L->next, q = L->next;
int e;
if (p == NULL)
return 0;
while (q)
{
while (p->next)
{
if (q->data > p->next->data)
{
e = p->data;
q->data = p->next->data;
p->next->data = e;
}
p = p->next;
}
printf("%d ", q->data);
q = q->next;
p = q;
}
printf("n");
return 1;
}
int creatList(LinkList* L)
{
initList(L);
LinkList p = *L, q;
ElemType e;
int i = 1;
char yn;
do
{
printf("请输入第%d个数据n", i);
i++;
scanf("%d", &e);
getchar();
if (rearinsertList(p, e))
printf("添加成功!是否继续添加数据?n");
yn = getchar();
} while (yn == 'Y' || yn == 'y');
return 1;
}
int deleteList(LinkList L, int e) //按值删除
{
LinkList p = L, q;
if (p == NULL)
return 0;
while (p->next != NULL && p->next->data != e)
p = p->next;
q = p->next;
p->next = q->next;
free(q);
return 1;
}
int locationList(LinkList L, int i) //查找
{
LinkList p = L;
int j = 0;
while (p)
if (p->data != i)
{
p = p->next;
j++;
}
else return j;
if (p == NULL)
return 0;
}
int cleanList(LinkList L) //清空
{
LinkList p = L;
while (L->next)
{
p = L->next;
L->next = p->next;
free(p);
}
return 1;
}
int mixedList(LinkList La, LinkList Lb, LinkList Lc)
{
LinkList pa = La->next, pb = Lb->next, pc = Lc, p;
while (pa && pb)
{
if (pa->data == pb->data)
{
rearinsertList(Lc, pa->data);
pa = pa->next;
pb = pb->next;
}
else if (pa->data < pb->data)
pa = pa->next;
else if (pa->data > pb->data)
pb = pb->next;
}
return 1;
}
int unionList(LinkList La, LinkList Lb, LinkList Lc)
{
LinkList pa = La->next, pb = Lb->next, pc = Lc, p;
while (pa && pb)
{
if (pa->data == pb->data)
{
rearinsertList(pc, pa->data);
pa = pa->next;
pb = pb->next;
}
else if (pa->data < pb->data) {
rearinsertList(pc, pa->data);
pa = pa->next;
}
else if (pa->data > pb->data) {
rearinsertList(pc, pb->data);
pb = pb->next;
}
}
while (pa) {
rearinsertList(pc, pa->data);
pa = pa->next;
}
while (pb) {
rearinsertList(pc, pb->data);
pb = pb->next;
}
return 1;
}
int diffList(LinkList La, LinkList Lb, LinkList Lc)
{
LinkList pa = La->next, pb = Lb->next, pc = Lc, p;
while (pa && pb)
{
if (pa->data == pb->data)
{
pa = pa->next;
pb = pb->next;
}
else if (pa->data < pb->data) {
rearinsertList(pc, pa->data);
pa = pa->next;
}
else if (pa->data > pb->data) {
rearinsertList(pc, pb->data);
pb = pb->next;
}
}
while (pa) {
rearinsertList(pc, pa->data);
pa = pa->next;
}
while (pb) {
rearinsertList(pc, pb->data);
pb = pb->next;
}
return 1;
}
int main()
{
LinkList L, La = NULL, Lb = NULL, Lc = NULL;
printf("开始新建链表:n");
creatList(&L);
printf("链表L为:");
sortPrintList(L);
ElemType e;
printf("n请选择你需要的操作:n");
printf("1:插入n");
printf("2:删除n");
printf("3:查找n");
printf("4:清空n");
printf("5:交(使用链表AB)n");
printf("6:并(使用链表AB)n");
printf("7:差(使用链表AB)n");
int op;
while (scanf("%d", &op) && op) {
if (op == 1) {
printf("请输入需要插入的位置:");
int i;
scanf("%d", &i);
printf("请输入需要插入的元素:");
scanf("%d", &e);
if (insertList(L, i, e))
printf("插入成功!n");
else
printf("插入失败!");
printf("最新的链表为:n");
printList(L);
}
else if (op == 2)
{
printf("请输入需要删除的值:");
int e;
scanf("%d", &e);
if (deleteList(L, e))
printf("删除成功!n");
else
printf("删除失败!n");
printf("最新的链表为:n");
sortPrintList(L);
}
else if (op == 3)
{
printf("请输入需要查找的元素:");
int i;
scanf("%d", &i);
if (locationList(L, i))
printf("该元素位于第%d个n", locationList(L, i));
else
printf("未查询到该元素!n");
}
else if (op == 4)
{
if (cleanList(L))
printf("清空成功!n");
}
else if (op == 5)
{
char yn;
if (La == NULL)
{
if (L->next)
{
getchar();
printf("链表A为空,是否使用链表L做为链表A?Y/Nn");
yn = getchar();
if (yn == 'Y' || yn == 'y')
{
initList(&La);
La = L;
printf("最新的链表A为:");
sortPrintList(La);
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
getchar();
printf("链表A非空,是否需要新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&La);
else
{
printf("继续使用,最新的链表A为:");
sortPrintList(La);
}
}
if (Lb == NULL)
{
printf("链表B为空,开始新建链表B:n");
creatList(&Lb);
}
else
{
getchar();
printf("链表B非空,是否新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&Lb);
else
{
printf("继续使用链表B,最新的链表B为:");
sortPrintList(Lb);
printf("n");
}
}
initList(&Lc);
mixedList(La, Lb, Lc);
printf("链表A为:");
sortPrintList(La);
printf("链表B为:");
sortPrintList(Lb);
printf("链表AB的交集为");
if (sortPrintList(Lc) == 0)
printf(":空n");
}
else if (op == 6)
{
char yn;
if (La == NULL)
{
if (L->next)
{
getchar();
printf("链表A为空,是否使用链表L做为链表A?Y/Nn");
yn = getchar();
if (yn == 'Y' || yn == 'y')
{
initList(&La);
La = L;
printf("最新的链表A为:");
sortPrintList(La);
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
getchar();
printf("链表A非空,是否需要新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&La);
else
{
printf("继续使用,最新的链表A为:");
sortPrintList(La);
}
}
if (Lb == NULL)
{
printf("链表B为空,开始新建链表B:n");
creatList(&Lb);
}
else
{
getchar();
printf("链表B非空,是否新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&Lb);
else
{
printf("继续使用链表B,最新的链表B为:");
sortPrintList(Lb);
printf("n");
}
}
initList(&Lc);
printf("链表A为:");
sortPrintList(La);
printf("链表B为:");
sortPrintList(Lb);
unionList(La, Lb, Lc);
printf("链表AB的并集为");
if (sortPrintList(Lc) == 0)
printf(":空n");
}
else if (op == 7)
{
char yn;
if (La == NULL)
{
if (L->next)
{
getchar();
printf("链表A为空,是否使用链表L做为链表A?Y/Nn");
yn = getchar();
if (yn == 'Y' || yn == 'y')
{
initList(&La);
La = L;
printf("最新的链表A为:");
sortPrintList(La);
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
printf("链表A为空,开始新建链表A:n");
creatList(&La);
}
}
else
{
getchar();
printf("链表A非空,是否需要新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&La);
else
{
printf("继续使用,最新的链表A为:");
sortPrintList(La);
}
}
if (Lb == NULL)
{
printf("链表B为空,开始新建链表B:n");
creatList(&Lb);
}
else
{
getchar();
printf("链表B非空,是否新建?n");
yn = getchar();
if (yn == 'Y' || yn == 'y')
creatList(&Lb);
else
{
printf("继续使用链表B,最新的链表B为:");
sortPrintList(Lb);
printf("n");
}
}
initList(&Lc);
printf("链表A为:");
sortPrintList(La);
printf("链表B为:");
sortPrintList(Lb);
diffList(La, Lb, Lc);
printf("链表AB的差集为");
if (sortPrintList(Lc) == 0)
printf(":空n");
}
else
printf("输入有误,请检查后再次输入!n");
}
}
最后
以上就是健康八宝粥为你收集整理的线性表的应用实例(交并差)的全部内容,希望文章能够帮你解决线性表的应用实例(交并差)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复