顺序表--动态创建方式

顺序表–动态创建方式

/**********************************************************
对于线性表中动态创建数组的方式的练习
Description:
主要要求有:
(1)建立一个顺序表,含有n个数据元素。
(2)输出顺序表。
(3)在顺序表中删除值为x的结点或者删除给定位置i的结点。
(4)实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
(5)输入整型元素序列,利用有序表插入算法建立一个有序表。
(7)在主函数中设计一个简单的菜单,分别测试上述算法。
Author:qichaoqun
Date:2019/07/09
************************************************************/
#include "stdio.h"
#include "stdlib.h"

/*定义int类型的别名*/
typedef int ElemType;

/*定义结构体*/
typedef struct {
    //指向数组首地址的指针(数组)
    ElemType *data;
    //当前数组的长度
    int length;
    //数组的最大长度
    int maxLength;
}SqlList;

/*显示菜单*/
void showMenu();
/*初始化数组*/
bool initList(SqlList &sqlList,int listSize);

/*往数组中添加一个元素*/
bool addElement(SqlList &sqlList,int element);

/*显示所有的元素*/
void showElements(SqlList &sqlList);

/*删除值为 x 的元素*/
bool deleteElementByValue(SqlList &sqlList,int value);

/*删除位置为 i 的元素*/
bool deleteElementByPosition(SqlList &sqlList,int position);

/*修改位置为i上的元素的值*/
bool updateValueByPosition(SqlList &sqlList,int position,int value);

/*将奇数放到偶数之前*/
void sortElementsByOdd(SqlList &sqlList);

/*插入一个序列到数组中去*/
bool insertElements(SqlList &sqlList);

int main(){
    //定义数组
    SqlList sqlList;
    //初始化指针
    sqlList.data = nullptr;

    while(true){
        showMenu();
        int option;
        scanf("%d",&option);
        switch (option){
            case 1:
                //初始化数组
                printf("请输入数组的大小 ");
                int size;
                scanf("%d",&size);
                if(initList(sqlList,size)){
                    printf("初始化数组成功\n");
                }else{
                    printf("数组已经存在,无法新建\n");
                }
                continue;
            case 2:
                //像数组中添加元素
                printf("请输入你要添加的元素");
                int element;
                scanf("%d",&element);
                if(addElement(sqlList,element)){
                    printf("添加成功\n");
                }else{
                    printf("添加失败\n");
                }
                continue;
            case 3:
                //删除值为 x 的元素
                printf("请输入你要删除的元素的值 ");
                int value;
                scanf("%d",&value);
                if(deleteElementByValue(sqlList,value)){
                    printf("删除成功\n");
                }else{
                    printf("删除失败,没有找到该值\n");
                }
                continue;
            case 4:
                //删除位置为 i 的元素
                printf("请输入你要删除的元素的位置 ");
                int position;
                scanf("%d",&position);
                if(deleteElementByPosition(sqlList,position)){
                    printf("删除成功\n");
                }else{
                    printf("删除失败\n");
                }
                continue;
            case 5:
                //修改位置为 i 上的元素
                printf("请输入元素的位置和要更改的内容 ");
                int positionTo;
                int valueTo;
                scanf("%d",&positionTo);
                scanf("%d",&valueTo);
                if(updateValueByPosition(sqlList,positionTo,valueTo)){
                    printf("修改成功\n");
                }else{
                    printf("修改失败\n");
                }
                continue;
            case 6:
                //显示所有的元素
                showElements(sqlList);
                continue;
            case 7:
                //将数组中的所有的奇数排在偶数之前
                sortElementsByOdd(sqlList);
                continue;
            case 8:
                //插入一个序列到数组中去
                if(insertElements(sqlList)){
                    printf("插入序列成功\n");
                }else{
                    printf("插入序列失败\n");
                }
                continue;
            case 9:
                //退出
                break;
            default:
                printf("输入有错,请重新输入");
        }
    }
};

/*插入一个序列到数组中去*/
bool insertElements(SqlList &sqlList){
    printf("请输入你要插入的序列的数量 ");
    int count = 0;
    scanf("%d",&count);
    //判断数组中的空闲位置是否够用
    if(count <= (sqlList.maxLength - sqlList.length)){
        //空间够用,可以插入
        //使用循环得到用户的输入
        printf("请输入有序序列 ");
        for (int i = 0; i < count; i++) {
            int element;
            scanf("%d",&element);
            sqlList.data[sqlList.length+i] = element;
            sqlList.length++;
        }
        return true;
    }
    return false;
}

/*将奇数放到偶数之前*/
void sortElementsByOdd(SqlList &sqlList){
    //定义用于存放奇数的数组
    SqlList oddsList;
    oddsList.data = (int*)(malloc(sizeof(ElemType) * sqlList.length));
    oddsList.length = 0;
    oddsList.maxLength = sqlList.length;
    //定义用于存放偶数的数组
    SqlList eventsList;
    eventsList.data = (int*)malloc(sizeof(ElemType) * sqlList.length);
    eventsList.length = 0;
    eventsList.maxLength = sqlList.length;
    //找到奇数和偶数分别放在不同的数组中
    for (int i = 0; i < sqlList.length; i++) {
        //判断是否为奇数
        if(sqlList.data[i] % 2 == 0){
            //为偶数则放入偶数数组中去
            oddsList.data[oddsList.length] = sqlList.data[i];
            oddsList.length++;
        }else{
            //放到奇数数组中去
            eventsList.data[eventsList.length] = sqlList.data[i];
            eventsList.length++;
        }
    }

    //将两个数组合并到一个
    SqlList newList;
    newList.data = (int*)(malloc(sizeof(ElemType) * (oddsList.length + eventsList.length)));
    newList.length = 0;
    newList.maxLength = oddsList.length + eventsList.length;

    for (int j = 0; j < eventsList.length; j++) {
        newList.data[j] = eventsList.data[j];
        newList.length++;
    }

    for (int k = 0; k < oddsList.length; k++) {
        newList.data[newList.length+k] = oddsList.data[k];
        newList.length++;
    }

    //输出数组
    printf("排列的结果为 ");
    for (int l = 0; l < newList.length; l++) {
        printf("%d ",newList.data[l]);
    }
    printf("\n");
}

/*修改位置为i上的元素的值*/
bool updateValueByPosition(SqlList &sqlList,int position,int value){
    //判断位置是否合法
    if(position < sqlList.maxLength){
        //判断该位置上是否有值
        if(position < sqlList.length){
            //有值则进行修改
            sqlList.data[position] = value;
            return true;
        }
    }
    return false;
}

/*删除位置为 i 的元素*/
bool deleteElementByPosition(SqlList &sqlList,int position){
    //判断位置是否合法
    if(position < sqlList.maxLength){
        if(position < sqlList.length){
            //判断该位置上是否有元素,如果有的话则删除
            //位置合法则进行删除
            for (int i = position; i < sqlList.length; i++) {
                sqlList.data[i] = sqlList.data[i+1];
            }
            sqlList.length--;
            return true;
        }
        //加入输入的位置合法,但是该位置上没有元素
        // 则不需要删除,同时也返回删除成功标志
        return true;
    }
    //只有当位置不合法时返回删除失败标志
    return false;
}

/*显示所有的元素*/
void showElements(SqlList &sqlList){
    printf("数组中的元素有 ");
    for (int i = 0; i < sqlList.length; i++) {
        printf("%d ",sqlList.data[i]);
    }
    printf("\n");
}

/*删除值为x的元素*/
bool deleteElementByValue(SqlList &sqlList,int value){
    //设置位置标记值
    int flag = 0;
    //设置是否找到的标记值
    bool isFound = false;
    //使用循环找到要删除的值
    for (int i = 0; i < sqlList.length; i++) {
        flag++;
        if(sqlList.data[i] == value){
            isFound = true;
            break;
        }
    }
    if(isFound){
        //找到该元素的情况下,将该元素删除
        // 并且其后面所有的元素都向前移动一个位置
        for(int i = flag;i < sqlList.length;i++){
            sqlList.data[i] = sqlList.data[i+1];
        }
        sqlList.length--;
        return true;
    }
    return false;
}

/*往数组中添加一个元素*/
bool addElement(SqlList &sqlList,int element){
    //判断是否还有空闲位置
    if(sqlList.length < sqlList.maxLength){
        //将元素添加到数组的尾部
        sqlList.data[sqlList.length] = element;
        sqlList.length++;
        return true;
    }
    return false;
}

/*初始化数组*/
bool initList(SqlList &sqlList,int listSize){
    //数组不存在的情况下,新建数组
    if(!sqlList.data){
        sqlList.data = (ElemType*)(malloc(sizeof(ElemType) * listSize));
        sqlList.length = 0;
        sqlList.maxLength = listSize;
        return true;
    }
    //数组存在则不再新建
    return false;
}

/*显示菜单*/
void showMenu(){
    printf("顺序表的操作\n");
    printf("1 初始化顺序表\n");
    printf("2 添加一个元素\n");
    printf("3 删除值为x的元素\n");
    printf("4 删除位置为i的元素\n");
    printf("5 修改位置为i的元素\n");
    printf("6 显示所有元素\n");
    printf("7 奇数排在偶数之前\n");
    printf("8 输入一个序列插入到数组中\n");
    printf("9 退出\n");
    printf("请输入你的选择 \n");
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值