用数组实现顺序表
在内存中启用地址编号连续的一批存储空间,以此存储线性表的全部数据。
代码在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; }
刚入行的小白,如有错误欢迎指正!!