(本文的代码包含顺序表的创建,输入输出删除,去重,以及交并补差的运算)
开门见山,所谓顺序表,便是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。
顺序表不单单只是数组这么简单,反而更像java中的arraylist,也就是动态数组,它的范围可以是无限延伸的(使用add方法向其中添加值),而不仅仅是C语言基本语法中的 int[],char[],这种固定长度的数组。想要使用C语言实现可以无限制扩大的数组也不难操作,其实就是增加这一线性结构中被开辟内存的数量,当所系内存不够时使用malloc语句来开辟新的空间即可,所以我们需要在原来的数组前面加一个控制结构来更好的控制他,比如可以获取他的元素个数之类的操作。
现在说回题目我们直接看顺序表的基本操作以及交并补差;下面代码所定义的顺序表是字符型的顺序表。
//
// Created by 无名高地 on 2021/10/13.
//
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 5 //初始量
#define Z 10 //增加量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;、
//定义控制结构体
typedef struct {
char *elem;//指向所创建的数组
int length;//数组中最后一个元素的位置
int maxlength;//数组的大小
}SqList;
//创建控制结构体
//传入控制结构体以及输入长度
Status c_list(SqList *sqList,int size){
sqList->maxlength = size;//初始长度为100
sqList->length = 0;//从0开始添加值
sqList->elem = (char*) malloc(sizeof(SqList));//开辟空间
return OK;
}
//向结构体中输入值
Status a_list(SqList *sqList){
for(int i=0;i<sqList->maxlength;i++){
scanf("%c",&sqList->elem[i]);
sqList->length++;
}
getchar();//获取回车,防止将回车输入
return OK;
}
//用于输出控制结构体指向的数组
Status p_list(SqList sqList){
for(int i=0;i<sqList.maxlength;i++){
printf("%c ",sqList.elem[i]);
}
return OK;
}
//用于删除结构体指向的数组单元中其中一个的值
Status del_list(SqList *sqList, int flag){
for(int i = flag+1;i<sqList->maxlength;i++){
sqList->elem[flag]=sqList->elem[i];
flag++;
}
sqList->length--;
sqList->maxlength--;
return OK;
}
//用于检查并去除重复元素以及非法字符
Status check(SqList *sqList){
char temp[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int flag[26]={0};
for(int i = 0;i < sqList->maxlength;i++){
int k=0;
for (int j=0;j<26;j++){
if(sqList->elem[i]==temp[j]){
flag[j]++;
break;
}
k++;
}
if(k==26) {
del_list(sqList, i);
i--;
}
}
sqList->length=0;
for(int i = 0;i<26;i++){
if(flag[i]>0){
sqList->elem[sqList->length]=temp[i];
sqList->length++;
}
}
sqList->maxlength=sqList->length;
p_list(*sqList);
return OK;
}
//用于求两个集合的并集
Status U_list(SqList La,SqList Lb){
SqList Lc;
Lc.elem=La.elem;
Lc.length=La.length;
for(int i = 0;i<Lb.maxlength;i++){
int k=0;
for(int j=0;j<La.maxlength;j++){
if(Lb.elem[i]==La.elem[j])
break;
k++;
}
if(k==La.maxlength){
Lc.elem[Lc.length]=Lb.elem[i];
Lc.length++;
}
}
Lc.maxlength=Lc.length;
p_list(Lc);
return OK;
}
//用于求两个集合的交集
Status N_list(SqList La,SqList Lb){
SqList Lc;
c_list(&Lc,N);
for(int i = 0;i<Lb.maxlength;i++){
for(int j=0;j<La.maxlength;j++){
if(Lb.elem[i]==La.elem[j]) {
Lc.elem[Lc.length] = La.elem[j];
Lc.length++;
break;
}
}
}
Lc.maxlength=Lc.length;
p_list(Lc);
return OK;
}
//用于求两个集合的补集
Status R_list(SqList sqList){
char temp[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int flag[26]={0};
for(int i = 0;i < sqList.maxlength;i++){
for (int j=0;j<26;j++){
if(sqList.elem[i]==temp[j]){
flag[j]++;
break;
}
}
}
for(int i=0;i<26;i++){
if(flag[i]==0){
printf("%c ",temp[i]);
}
}
return OK;
}
//用于求集合a对集合b的差集
Status D_list(SqList La,SqList Lb){
SqList Lc;
c_list(&Lc,N);
for(int i=0;i<La.maxlength;i++){
int k=0;
for (int j=0;j<Lb.maxlength;j++){
if(La.elem[i]==Lb.elem[j]){
break;
}
k++;
}
if(k==Lb.maxlength){
Lc.elem[Lc.length]=La.elem[i];
Lc.length++;
}
}
Lc.maxlength=Lc.length;
p_list(Lc);
return OK;
}
//用来将两个递增表合并为一个递减表(本次实验中没有用到)
Status i_list(SqList L1,SqList L2){
SqList L3;
L3.length = L1.length+L2.length;
L3.maxlength = L3.length;
L3.elem = (char *) malloc(sizeof(SqList));
int a = L1.length-1;
int b = L2.length-1;
for(int i = 0;a>=0||b>=0;i++){
if(a<0){
while (b>=0){
L3.elem[i]=L2.elem[b];
i++;
b--;
}
}
if(b<0){
while (a>=0){
L3.elem[i]=L1.elem[a];
i++;
a--;
}
}
if(L1.elem[a]<=L2.elem[b]){
L3.elem[i]=L2.elem[b];
b--;
}
else if(L1.elem[a]>=L2.elem[b]){
L3.elem[i]=L1.elem[a];
a--;
}
}
for(int i=0;i<L3.length;i++){
printf("%c\n",L3.elem[i]);
}
return OK;
}
//主函数
int main(){
int n;
SqList La,Lb;
printf("请输入A表的长度\n");
scanf("%d",&n);
getchar();
c_list(&La,n);
printf("请输入A表的内容\n");
a_list(&La);
printf("表A去除重复以及非法字符后如下\n");
check(&La);
printf("\n请输入B表的长度\n");
scanf("%d",&n);
getchar();
c_list(&Lb,n);
printf("请输入B表的内容\n");
a_list(&Lb);
printf("表B去除重复以及非法字符后如下\n");
check(&Lb);
while (1){
printf("\n程序功能如下,请选择你需要的功能\n1,求A,B表的并集\n2,求A表的补集\n3,求B表的补集\n4,求A,B表的交集\n5,求A表对B表的差集\n6,求B表对A表的差集\n7,退出\n");
scanf("%d",&n);
getchar();
switch(n){
case 1:
U_list(La,Lb);
break;
case 2:
R_list(La);
break;
case 3:
R_list(Lb);
break;
case 4:
N_list(La,Lb);
break;
case 5:
D_list(La,Lb);
break;
case 6:
D_list(Lb,La);
break;
case 7:
printf("运行结束,谢谢使用\n");
return 0;
}
}
}
本人初学数据结构,有讲得不对的地方,欢迎一起交流学习。