顺序表表示集合的操作

/*【问题描述】
本题要求定义并实现一个用于存放整型数据的集合,编程实现集合的各种操作并在main函数中测试。
【基本要求】
实现集合的以下操作:
(1)增加一个数到集合中; //完成
(2)从集合中去掉一个元素; //完成
(3)判断一个元素是否在集合中; //完成
(4)实现两个集合的并运算;
(5)实现两个集合的交运算;
(6)实现两个集合的差运算;
(7)判断两个集合是否相等;
(8)判断一个集合是否是另一个集合的子集,若是,则求绝对补集,否则,求相对补集;
(9)显示输出集合中的所有元素。 //完成
设计一个菜单,调用上述要求的所有功能及退出系统等。
【实现提示】
可以以有序链表或顺序表表示集合。
【测试数据】
在main函数中调用各种操作,显示操作结果。测试数据应尽可能体现各种操作结果。
*/
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
//结构体定义
typedef int ElemType; //表中的元素均为整型
typedef struct{
int* elem; //存储空间基地址
int length; //表中元素的个数
int listsize; //表容量大小
}SqList; //顺序表类型定义

int ListInsert_Sq(SqList &L, int pos, int e); //在pos处插入元素e
int ListDelete_Sq(SqList &L, int pos, int &e); //在pos处删除元素,并用e返回
int ListLocate_Sq(SqList L, int e); //查找元素,返回位置e
void ListPrint_Sq(SqList L); //顺序输出线性表

//结构初始化与销毁操作
int InitList_Sq(SqList &L) //初始化L为一个空的有序顺序表
{
L.elem=(int )malloc(LIST_INIT_SIZEsizeof(int));
if(!L.elem)
exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
L.length=0;
return OK;
}
//主函数
int main() {
SqList L;
int operationType; //操作种类
if(InitList_Sq(L)!= OK)
{
printf(“InitList_Sq: 初始化失败!!!\n”);
return -1;
}
for(int i = 1; i <= 10; ++ i)
{
ListInsert_Sq(L, i, i);
}
printf(“集合的操作(顺序表)\n”);
printf(“1.增加\n2.删除\n3.查找\n4输出顺序表\n”);
printf(“请输入操作:”);
scanf("%d", &operationType);
while(operationType != 0)
{
if(operationType == 1) //增加操作
{
int pos, elem;
printf(“请输入插入的位置”);
scanf("%d", &pos);
printf(“请输入插入的元素”);
scanf("%d", &elem);
ListInsert_Sq(L, pos, elem);
}
else if(operationType == 2) //删除操作
{
int pos; int elem;
printf(“请输入要删除的位置:”);
scanf("%d", &pos);
ListDelete_Sq(L, pos, elem);
printf(“删除的元素为%d\n”, elem);
}
else if(operationType == 3) //查找定位操作
{
int elem;
printf(“请输入要查找的元素”);
scanf("%d", &elem);
int pos = ListLocate_Sq(L, elem);
if(pos >= 1 && pos <= L.length)
{
printf(“该元素的位置是%d\n”, pos);
}
else
{
printf(“表中没有这个元素\n”);
}
}
else if(operationType == 4) //输出操作
{
ListPrint_Sq(L);
}
else if(operationType == 0)
{
return 0;
}
else
{
printf(“输入有误,请重新输入\n”);
}
printf(“请输入操作:”);
scanf("%d", &operationType);
}
}
int ListInsert_Sq(SqList &L, int pos, int e)
{
int *newbase; //定义扩容后的首地址
if(pos >= 1&&pos <= L.length + 1) //判断给的pos是否在L.length的范围之内
{
if(L.length >= L.listsize) //如果L.length已经达到或超出设定值,需要扩容
{
newbase = (int *)realloc(L.elem,(L.listsize+LISTINCREMENT) * sizeof(int)); //给newbase动态分配一个长度为LISTINCREMENT的新空间
if(!newbase) //如果分配失败则返回错误
return ERROR;
L.elem = newbase; //新分配空间的基地址
L.listsize += LISTINCREMENT;//现在的空间长的等于原来空间长度加上新分配的空间长度
}
int *p,*q;
p = &(L.elem[pos - 1]); //将原来pos位置元素的地址分配给指针p
for(q = &(L.elem[L.length - 1]);q >= p;–q)//将原来顺序表最后一个位置数据的地址分配给q,然后从后往前依次将数据向后移动一位
{
*(q + 1) = *q;
}
*p = e; //将数据e放到pos位置
++L.length; //顺序表的长度要加一
return OK;
}
else
return OVERFLOW;
}
int ListDelete_Sq(SqList &L, int pos, int &e)
{
if(pos >= 1&&pos <= L.length)//判断pos是否在顺序表的长度之内
{
int *q;
e = L.elem[pos - 1];//先将e赋值,也就是返回删掉了哪个数
for(q = &(L.elem[pos - 1]);q <=&(L.elem[L.length - 1]);++q)//将pos位置以后的元素依次向前移动一位
{
*q = *(q + 1);
}
L.length = L.length - 1;//L的长度减一
}
else
return OVERFLOW;
}
int ListLocate_Sq(SqList L, int e)
{
int a = -1; //给a赋初值,无论查找的数据在第几个,都不可能是第-1个,所以赋值-1
for(int i = 0;i <= L.length -1;i++)//for循环进行查找
{
if(L.elem[i] == e)
{
a = i;
break;
}
}
if(a >= 0&&a <= L.length -1)
return a + 1;//如果a的值满足要求,则返回a
else
return ERROR;//如果a不满足,则返回错误。
}
void ListPrint_Sq(SqList L)
{
for(int i = 0;i <= L.length - 2;i++)
{
printf("%d “,L.elem[i]);
}
printf(”%d",L.elem[L.length -1]);

}

发布了11 篇原创文章 · 获赞 0 · 访问量 172

猜你喜欢

转载自blog.csdn.net/yucan1234/article/details/93757014