如何用C语言实现单链表的集合运算(头插法)
发布日期:2021-05-07 13:02:58 浏览次数:23 分类:精选文章

本文共 4254 字,大约阅读时间需要 14 分钟。

#include

#include

#define ERROR -1

#define OK 1

typedef int Status;

typedef int ElemType;

typedef struct LNode{

ElemType data;

struct LNode * next;

} LNode, *LinkList;

//创建空链表

Status Init_LinkList(LinkList &L){

LinkList p;

p = (LinkList)malloc(sizeof(LNode));

if (!p) return ERROR;

L = p;

L->next = NULL;

return OK;

}

int x, y;

void show(){

printf("\t\t*********单链表(头插法)集合运算************\n");

printf("\n");

printf("\t\t\t1 集合A数据输入\n");

printf("\t\t\t2 集合B数据输入\n");

printf("\t\t\t3 集合A数据显示\n");

printf("\t\t\t4 集合B数据显示\n");

printf("\t\t\t5 集合A和集合B的并集\n");

printf("\t\t\t6 集合A和集合B的交集\n");

printf("\t\t\t7 集合A和集合B的差集\n");

printf("\t\t\t0 退出系统\n");

printf("\n");

printf("\t\t*********单链表(头插法)集合运算*************\n");

printf("\n");

}

// 输入

Status input(LinkList &L, int n){

LinkList p;

int i;

for (i = 1; i <= n; i++) {

printf("请输入集合的第%d个数:", i);

p = (LinkList)malloc(sizeof(LNode));

if (p != NULL) {

scanf("%d", &p->data);

p->next = L->next;

L->next = p;

} else {

return ERROR;

}

printf("集合输入完成!\n");

return OK;

}

// 输出

void Output(LinkList L){

if (L->next == NULL) {

printf("该链表是空链表!\n");

LinkList p;

for (p = L->next; p != NULL; p = p->next) {

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

printf("\n");

}

}

// 链表清空

Status ClearList_L(LinkList &L){

LinkList p, q;

p = L->next;

if (!p) return OK;

while (p) {

q = p;

p = p->next;

free(q);

L->next = NULL;

return OK;

}

// 并集

void and_set(LinkList La, LinkList Lb, LinkList &Lc){

if (Lc->next != NULL) {

ClearList_L(Lc);

LinkList p, q, s;

p = La->next;

while (p) {

q = Lc->next;

while (q && (q->data != p->data)) {

q = q->next;

if (!q) {

s = (LinkList)malloc(sizeof(LNode));

s->data = p->data;

s->next = Lc->next;

Lc->next = s;

}

p = p->next;

p = Lb->next;

while (p) {

q = Lc->next;

while (q && (q->data != p->data)) {

q = q->next;

if (!q) {

s = (LinkList)malloc(sizeof(LNode));

s->data = p->data;

s->next = Lc->next;

Lc->next = s;

}

p = p->next;

}

// 交集

void intersection(LinkList La, LinkList Lb, LinkList &Lc){

if (Lc->next != NULL) {

ClearList_L(Lc);

LinkList p, q, s, k;

p = La->next;

while (p) {

q = Lb->next;

while (q) {

if (q->data == p->data) {

break;

} else {

q = q->next;

if (q) {

s = Lc->next;

while (s) {

if (s->data == p->data) {

break;

} else {

s = s->next;

if (!s) {

k = (LinkList)malloc(sizeof(LNode));

k->data = p->data;

k->next = Lc->next;

Lc->next = k;

}

}

p = p->next;

}

// 差集

void difference_set(LinkList La, LinkList Lb, LinkList &Lc){

if (Lc->next != NULL) {

ClearList_L(Lc);

LinkList p, q, s, k;

p = La->next;

while (p) {

q = Lb->next;

while (q) {

if (q->data != p->data) {

break;

} else {

q = q->next;

if (!q) {

s = Lc->next;

while (s) {

if (s->data != p->data) {

break;

} else {

s = s->next;

if (!s) {

k = (LinkList)malloc(sizeof(LNode));

k->data = p->data;

k->next = Lc->next;

Lc->next = k;

}

}

next;

}

int main(){

int choice;

LinkList La, Lb, Lc;

Init_LinkList(La);

Init_LinkList(Lb);

Init_LinkList(Lc);

while (1) {

show();

scanf("%d", &choice);

switch(choice){

return 0;

// 交集功能未完成,请忽略

上一篇:用C语言实现数组查找运算
下一篇:回文判断

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月06日 16时56分28秒