关于数据结构的一道入门题(?也许)

这其实是我们老师留的作业题,我觉得还挺好玩的,写到后面的题直接可以用前面的函数了,其实我还是有一些不太懂,比如不知道这句的意思L = (SqList *)malloc(sizeof(SqList)),但是好歹写出来了不是。

期间我犯了一个低级错误花了我快一个小时找错,最后发现是==用成了=,哭了😭

还有,我中途打了一个汉字的分号,然后我还忘了那个报错是因为输入法,又来来回回瞎搞了半天

然后,在我要交的时候,最后一个求差集的结果,该减的没减,不改减的减了,我感觉是函数里面for循环的i用错了,最后发现确实是循环的问题,少一个循环

1、已知顺序表L为按值递增有序的,编写算法将数据元素e插入到顺序表L中,使之仍有序。

2、已知顺序表L为按值递增有序的,设计算法清除顺序表中多余重复元素,注意其删除位置之后的元素如何移动。

 

3、顺序表LA和顺序表LB中的元素值无序,求出LA和LB的并集,结果存储在顺序表LC中。

 

4、顺序表LA和顺序表LB中的元素值无序,求出LA和LB的交集,结果存储在顺序表LC中。

 

5、顺序表LA和顺序表LB中的元素值无序,求出LA和LB的差集,结果存储在顺序表LC中。

#include <stdio.h>

 

#include <malloc.h>

 

#define Maxsize 100//最大允许长度

 

typedef int ElemType;

 

typedef int DataType;

 

 

 

typedef struct

 

{ ElemType data[Maxsize ];//存放顺序表元素

 

int length;//存放顺序表的长度

 

} SqList;//顺序表的类型

 

 

 

 

 

//分配存放线性表的空间

 

void InitList(SqList *L)

 

{ L = (SqList *)malloc(sizeof(SqList));

 

 

 

L->length = 0;

 

 

 

}

 

 

 

//建立顺序表

 

void CreatList(SqList *L, DataType a[], int n)

 

{ if (n > Maxsize)

 

printf("顺序表存储空间不够\n");

 

else

 

{ printf("成功存入\n");

 

for (int i = 0; i < n; i++)

 

{ L->data[i] = a[i];

 

}

 

L->length = n;

 

}

 

}

 

 

 

//展示顺序表里面的数据

 

void PrintList(SqList *L)

 

{ printf("存入元素为:");

 

for (int i = 0; i < L->length; i++)

 

{ printf("%d ", L->data[i]);

 

}

 

printf("\n");

 

}

 

 

 

//插入一个数据n

 

void Insert(SqList *L, ElemType n)

 

{ int j = 0;

 

if (L->length + 1 > Maxsize)

 

printf("插入不成功\n");

 

else

 

{ printf("插入成功\n");

 

for (int i = 0; i < L->length; i++)

 

{ if (n >= L->data[i] && n <= L->data[i + 1])

 

j = i + 1;

 

}

 

}

 

for (int i = L->length; i >= j; i--)

 

L->data[i + 1] = L->data[i];

 

L->data[j] = n;

 

L->length++;

 

}

 

 

 

//删除相同元素

 

void DestroyList(SqList *L)

 

{ int i = L->length;

 

for (int i = 0; i < L->length - 1; i++)

 

{ for (int j = i + 1; j < L->length - 1; j++)

 

{ if (L->data[i] == L->data[j])

 

{ for (int k = j; k < L->length - 1; k++)

 

{ L->data[k] = L->data[k + 1];

 

}

 

L->length--;

 

}

 

}

 

}

 

if (i > L->length)

 

printf("该组数据有重复,已删除\n");

 

}

 

 

 

void Union(SqList *A, SqList *B, SqList *C)//并集

 

{ for (int i = 0; i < A->length; i++)

 

C->data[i] = A->data[i];

 

C->length = A->length;

 

for (int j = 0; j < B->length; j++)

 

C->data[A->length + j] = B->data[j];

 

C->length = A->length + B->length;

 

DestroyList(C);

 

}

 

 

 

void Intersection(SqList *A, SqList *B, SqList *C)//交集

 

{ int k = 0;

 

for (int i = 0; i < A->length; i++)

 

C->data[i] = A->data[i];

 

C->length = A->length;

 

for (int j = 0; j < B->length; j++)

 

C->data[A->length + j] = B->data[j];

 

C->length = A->length + B->length;

 

for (int i = 0; i < C->length - 1; i++)

 

{ for (int j = i + 1; j < C->length - 1; j++)

 

{ if (C->data[i] == C->data[j])

 

{ C->data[k] = C->data[i];

 

k++;

 

}

 

}

 

}

 

C->length = k ;

 

}

 

 

 

//求C=A-B

 

void Different(SqList *A, SqList *B, SqList *C, SqList *D)

 

{ //先把A放入C

 

for (int i = 0; i < A->length; i++)

 

C->data[i] = A->data[i];

 

C->length = A->length;

 

//找A,B交集,放入D

 

Intersection(A, B, D);

 

//C=A-B=A-D

 

for (int i = 0; i < D->length; i++)

 

for (int j = 0; j < C->length; j++)

 

if (C->data[j] == D->data[i])

 

{ for (int k = 0; k < C->length - j; k++)

 

C->data[j + k] = C->data[j + k + 1];

 

C->length--;

 

}

 

}

 

 

 

int main()

 

{ SqList L, L2, LA, LB, LC1, LC2, LC3, LC4;

 

InitList( &L);

 

InitList(&L2);

 

InitList(&LA);

 

InitList(&LB);

 

InitList(&LC1);

 

InitList(&LC2);

 

InitList(&LC3);

 

InitList(&LC4);

 

//(1)已知顺序表L为按值递增有序的

 

//编写算法将数据元素e插入到顺序表L中,使之仍有序。

 

printf("(1)\n");

 

int r[5] = {1, 2, 5, 8, 9};

 

ElemType e = 4;

 

CreatList(&L, r, 5);

 

//创建一个顺序表,存入一个数组

 

PrintList(&L);//输出初始数据

 

Insert(&L, e); //插入元素e=8

 

PrintList(&L);//输出结果

 

printf("-----------------\n");

 

//(2)已知顺序表L为按值递增有序的

 

//设计算法清除顺序表中多余重复元素

 

//注意其删除位置之后的元素如何移动。

 

printf("(2)\n");

 

int n[7] = {1, 2, 5, 8, 8, 9, 10};

 

CreatList(&L2, n, 7);

 

//创建一个顺序表,存入一个数据

 

PrintList(&L2);//输出初始数据

 

DestroyList(&L2);//删除重复数据

 

PrintList(&L2);//输出结果

 

printf("-----------------\n");

 

// 3、顺序表LA和顺序表LB中的元素值无序,

 

//求出LA和LB的并集,结果存储在顺序表LC1中。

 

printf("(3)\n");

 

int a[5] = {9, 22, 5, 6, 1};

 

int b[4] = {5, 6, 8, 2};

 

CreatList(&LA, a, 5);

 

printf("存入LA");

 

PrintList(&LA);

 

CreatList(&LB, b, 4);

 

printf("存入LB");

 

PrintList(&LB);

 

printf("两顺序表的交集存入LC1\n");

 

Union( &LA, &LB, &LC1);//求LA,LB并集并存储在LC

 

PrintList(&LC1);

 

printf("-----------------\n");

 

//4、顺序表LA和顺序表LB中的元素值无序,

 

//求出LA和LB的交集,结果存储在顺序表LC2中。

 

printf("(4)\n");

 

printf("令LA,LB不变,则两顺序表的交集存入LC2\n");

 

Intersection(&LA, &LB, &LC2);

 

PrintList(&LC2);

 

printf("-----------------\n");

 

//5、顺序表LA和顺序表LB中的元素值无序,

 

//求出LA和LB的差集(LA-LB),结果存储在顺序表LC3中。

 

printf("(5)\n");

 

printf("令LA,LB不变,则两顺序表的差集存入LC3\n");

 

Different(&LA, &LB, &LC3, &LC4); //LC4是起过渡作用的顺序表

 

PrintList(&LC3);

 

return 0;

 

}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值