• 用数组实现顺序表


    用数组实现顺序表


    在内存中启用地址编号连续的一批存储空间,以此存储线性表的全部数据


    代码在VS2019中编译,很多编写方式为了安全根据软件进行了更改

    本次线性表用一维数组来实现

    完成了 线性表初始化,替换,查找,插入,删除,遍历,逆转等基本操作较为简单

    #include<stdio.h>
    #include<windows.h>                         //清屏和颜色设置需要
    #include<stdbool.h>                         //在VS需要引入头文件表示true和false  代表 0 和 1
    #define Maxsize  20                         //定义线性表最大长度
    enum returninfo {success,fail,overflow,underflow,range_error};  //定义返回信息清单
    int dataarray[Maxsize];                     //数据域数组
    int count;                                 //计数器统计节点个数即线性表的有效数据的长度
    enum returninfo create(int number);             //顺序表的初始化
    bool empty(void);                        //判断是否为空
    int length(void);                         //求顺序表的长度
    enum returninfo traverse(void);          //遍历顺序表的所有元素
    enum returninfo get(int position, int* item); //读取一个节点
    enum returninfo repalce(int position, const int item);//修改一个节点
    enum returninfo insert(int position, const int item); //插入一个节点
    enum returninfo remove(int position);                 //删除一个节点
    enum returninfo invertlist(void);                     //顺序表所有数据反转
    void clearscreen(void);                                  //清屏
    void showMenu(void);                                  //显示菜单函数
    enum returninfo processmenu(int menuchoice);          //菜单函数
    
    
    /*-----------------------------------------
    函数名 :invertlist
    描  述 :反转顺序表数据
    入口参数:无
    出口参数:enum returninfo类型判断操作是否成功
    ------------------------------------------*/
    enum returninfo invertlist(void) {
        int halfpos, tempdata;
        if (empty()) {
            return underflow;
        }
        halfpos = count / 2;
        for (int i = 0; i < halfpos; i++) {
            tempdata = dataarray[i];
            dataarray[i] = dataarray[count - 1 - i];
            dataarray[count - 1 - i] = tempdata;
        }
        return success;
    }
    /*-----------------------------------------
    函数名 :length
    描  述 :得到顺序表长度
    入口参数:无
    出口参数:int 型
    ------------------------------------------*/
    int length(void) {
        return count;
    }
    /*-----------------------------------------
    函数名 :get
    描  述 :读取一个节点
    入口参数:位置 int 型引用
    出口参数:enum returninfo类型判断操作是否成功
    ------------------------------------------*/
    enum returninfo get(int position, int* item) {
        if (empty()) {
            return underflow;
        }
        if (position <= 0 || position > count) {
            return range_error;
        }
        *item = dataarray[position - 1];
        return success;
    }
    /*-----------------------------------------
    函数名 :remove
    描  述 :删除指定数据的节点
    入口参数:位置 
    出口参数:enum returninfo类型判断操作是否成功
    ------------------------------------------*/
    enum returninfo remove(int position) {
        if (empty()) {
            return underflow;
        }
        if (position <= 0 || position > count) {
            return range_error;
        }
        for (int i = position - 1; i < count; i++) {
            dataarray[i] = dataarray[i + 1];
        }
        count--;
        return success;
    }
    /*-----------------------------------------
    函数名 :insert
    描  述 :插入数据到指定位置
    入口参数:位置 数据
    出口参数:enum returninfo类型判断操作是否成功
    ------------------------------------------*/
    enum returninfo insert(int position, const int item) {
        if (count + 1 >= Maxsize) {
            return overflow;
        }
        if (position <= 0 || position > count + 1) {
            return range_error;
        }
        for (int i = count; i >= position; i--) {
            dataarray[i] = dataarray[i - 1];
        }
        dataarray[position - 1] = item;
        return success;
    }
    /*-----------------------------------------
    函数名 :repalce
    描  述 :修改指定位置的数据
    入口参数:位置 替换值
    出口参数:enum returninfo类型判断操作是否成功
    ------------------------------------------*/
    enum returninfo repalce(int position, const int item) {
        if (empty()) {
            return underflow;
        }
        if (position <= 0 || position > count) {
            return range_error;
        }
        dataarray[position - 1] = item;
        return success;
    }
    /*-----------------------------------------
    函数名 :empty
    描  述 :判断链表是否为空
    入口参数:无
    出口参数:bool类型
    ------------------------------------------*/
    bool empty(void) {
        if (count == 0)
            return true;
        else
            return false;
    }
    /*-----------------------------------------
    函数名 :traverse
    描  述 :遍历顺序表中的所有数据
    入口参数:无
    出口参数:枚举类型返回是否成功
    ------------------------------------------*/
    enum returninfo traverse(void) {
        if (empty()) {
            return underflow;
        }
        printf("表中的数据为:  ");
        for (int i = 0; i < count; i++) {
            printf("%d ",dataarray[i]);
        }
        printf("
    ");
        return success;
    }
    /*-----------------------------------------
    函数名 :create
    描  述 :创建初始化顺序表
    入口参数:顺序表的大小
    出口参数:枚举类型返回是否成功
    ------------------------------------------*/
    enum returninfo create(int number) {
        count = number;
        printf("请依此输入数据(用空格隔开):
    ");
        for (int i = 0; i < number; i++) {
            scanf_s("%d",&dataarray[i]);
        }
        return success;
    }
    
    void clearscreen(void) {
        system("cls");
    }
    /*-----------------------------------------
    函数名 :showMenu
    描  述 :显示功能菜单
    入口参数:无
    出口参数:无
    ------------------------------------------*/
    void showMenu(void) {
        printf("顺序表基本功能菜单              
    ");
        printf("=====================         
    ");
        printf("1.输入数组(键盘输入)          
    ");
        printf("2.显示数据(遍历全部数据)      
    ");
        printf("3.修改数组(要提供位置和新值)  
    ");
        printf("4.插入数据(要提供位置和新值)  
    ");
        printf("5.删除数据(要提供位置)       
    ");
        printf("6.读取数据(要提供位置)       
    ");
        printf("7.求表长度                    
    ");
        printf("8.数据反转(全部数据逆序存储)  
    ");
        printf("9.结束程序                    
    ");
        printf("=====================        
    ");
    
    }
    /*-----------------------------------------
    函数名 :userchoice
    描  述 :得到用户输入的选项
    入口参数:无
    出口参数:返回输入选项
    ------------------------------------------*/
    int userchoice(void) {
        int menuchoice;
        printf("请输入您的选择:");
        scanf_s("%d",&menuchoice);
        return menuchoice;
    }
    /*-----------------------------------------
    函数名 :processmenu
    描  述 :执行用户选择的功能
    入口参数:功能选项
    出口参数:无
    ------------------------------------------*/
    enum returninfo processmenu(int menuchoice) {
        int position=0, item, returnvalue;
        switch (menuchoice) {                   //根据用户的选择进行相应的操作
        case 1:
            printf("请问您需要输入数据的个数,注意要在%d个以内:",Maxsize);
            scanf_s("%d",&item);
            if (item > Maxsize) {
                printf("对不起,输入的数据超限,操作已取消!
    ");
            }
            else {
                returnvalue = create(item);
                if (returnvalue == success) {
                    printf("建立顺序表操作成功!
    ");
                }
            }
            break;
        case 2:
            returnvalue = traverse();
            if (returnvalue == success) {
                printf("遍历顺序表操作成功!
    ");
            }
            break;
        case 3:
                printf("请输入您需要更改的位置:");
                scanf_s("%d",&position);
                printf("请输入您需要更改的值:");
                scanf_s("%d",&item);
                returnvalue = repalce(position,item);
                if (returnvalue == underflow) {
                    printf("对不起,顺序表为空
    ");
                }
                else if (returnvalue == range_error) {
                    printf("对不起,修改的位置超出了范围!
    ");
                }
                else {
                    printf("修改成功!
    ");
                }
                break;
        case 4:
            printf("请输入您打算插入数据的位置:");
            scanf_s("%d",&position);
            printf("请输入您需要插入的新数据");
            scanf_s("%d",&item);
            returnvalue = insert(position,item);
            if (returnvalue == overflow) {
                printf("对不起,顺序表溢出,无法插入!
    ");
            }
            else if (returnvalue == range_error) {
                printf("对不起,修改的位置超出了范围!
    ");
            }
            else {
                printf("插入操作成功!
    ");
            }
            break;
        case 5:
            printf("请输入您需要删除数据的位置:");
            scanf_s("%d",&position);
            returnvalue = remove(position);
            if (returnvalue == underflow) {
                printf("对不起,顺序表已空!
    ");
            }
            else if (returnvalue == range_error) {
                printf("对不起,删除的位置超出了范围!
    ");
            }
            else {
                printf("删除操作成功!
    ");
            }
            break;
        case 6:
             printf("请输入您需要读取的数据的位置:");
            scanf_s("%d",&position);
            returnvalue = get(position, &item);
            if (returnvalue == underflow) {
                printf("对不起,顺序表已空!
    ");
            }
            else if (returnvalue == range_error) {
                printf("对不起,读取的位置超出了范围!
    ");
            }
            else {
                printf("读取的数据为:%d
    读取操作成功
    ",item);
            }
            break;
        case 7:
            printf("顺序表的长度为:%d
    ",length());
            printf("求顺序表长度操作成功!
    ");
            break;
        case 8:
            returnvalue = invertlist();
            if (returnvalue == overflow) {
                printf("对不起,顺序表已空!
    ");
            }
            else {
                printf("顺序表所有元素反转操作成功!
    ");
            }
            break;
        case 9:
            exit(0);
        default:
            printf("对不起您输入的编号有错!请重新输入!!!
    ");
            break;
        }
        return success;
    }
    int main(void) {
    
        SetConsoleTitle("顺序表实现线性表的基本功能(C语言版)");
        int menuchoice;                   //定义变量,菜单选单选的选择
    
        system("color f0");               //修改屏幕背景颜色和字体颜色
        clearscreen();                    //清屏
    
        while (true) {                   //永真循环
            showMenu();                  //显示菜单
            menuchoice = userchoice();   //获取用户的选择
            processmenu(menuchoice);     //处理用户的选择
            system("pause");             //暂停
            clearscreen();               //清屏
        }
        
    
        return 0;
    }

    刚入行的小白,如有错误欢迎指正!!

  • 相关阅读:
    lua 根据路径获取文件名
    python中的re模块
    正则表达式中的开头和结尾
    正则表达式匹配多个字符
    正则表达式中匹配单个字符
    正则表达式的作用
    gevent实现协程
    greenlet实现协程
    生成器的使用注意
    生成器实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/WineinSeptember/p/12740160.html
Copyright © 2020-2023  润新知