顺序表表示集合的操作

/*【问题描述】
本题要求定义并实现一个用于存放整型数据的集合,编程实现集合的各种操作并在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_SIZE*sizeof(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]);
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值