这其实是我们老师留的作业题,我觉得还挺好玩的,写到后面的题直接可以用前面的函数了,其实我还是有一些不太懂,比如不知道这句的意思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;
}