标签:
#include <cstdio> #include <cstring> ///都用c语言写的 #include <iostream> ///建议从主函数开始看 #include <cstdlib> using namespace std; int sequence_map[1000]; int total_sequence = 0; void init_sequence() ///主界面。 ///一级菜单中顺序表的操作界面 init初始化 { printf("* *\n"); printf("* 请输入对应序号进行操作 *\n"); printf("* 1.顺序表的建立 *\n"); printf("* 2.顺序表的插入 *\n"); printf("* 3.顺序表的输出 *\n"); printf("* 4.顺序表的删除 *\n"); printf("* 5.顺序表的长度 *\n"); printf("* 6.退出 *\n"); printf("**********************************\n"); printf("请输入对应序号进行操作:"); } void establish_sequence() ///建立顺序表 { system("cls"); memset(sequence_map,0,sizeof(sequence_map)); ///初始化数组为0 memset杂类函数 printf("请输入顺序表数据组数:"); int group; scanf("%d",&group); ///首先输入数据的组数 total_sequence=group; printf("请分别输入%d组数据,用空格或回车隔开:\n",group); for(int i=0; i<group; i++) ///在输入数据的同时进行排序 { int sequence_temp; bool flag=false; ///bool变量用来记录数据是否被插入当前数组 scanf("%d",&sequence_temp); for(int j=0; j<i; j++) ///在已经输入的数据中循环找是否有比当前元素大的元素 { if(sequence_temp<sequence_map[j]) ///如果存在比当前值更大的元素 { ///使bool变量变成true,表示数据被插入数组 flag=true; for(int k=i-1; k>=j; k--) ///插入排序。 ///把当前顺序表中比这个元素大的元素都后移一位 sequence_map[k+1]=sequence_map[k]; sequence_map[j]=sequence_temp; ///将这个元素插入顺序表 break; } } if(!flag) ///如果循环没有找到比当前元素大的元素 sequence_map[i]=sequence_temp; ///说明当前元素为最大值,直接加到数组最后一位 } printf("创建顺序表成功!"); system("pause"); system("cls"); ///清屏。 init_sequence(); ///返回主界面。 } void insert_sequence() ///插入数据和建立顺序表原理相同 insert插入 { ///可以优化成同一个程序 system("cls"); printf("请输入要插入的数据:"); int insert_temp; ///insert_temp是要插入的数。 bool flag=false; scanf("%d",&insert_temp); for(int i=0; i<total_sequence; i++) { if(insert_temp<sequence_map[i]) ///在已经输入的数据中循环找是否有比当前元素大的元素 { flag=true; ///如果存在比当前值更大的元素 for(int k=total_sequence-1; k>=i; k--) ///把当前顺序表中比这个元素大的元素都后移一位;从最后一位开始后移。 sequence_map[k+1]=sequence_map[k]; sequence_map[i]=insert_temp; break; } } if(!flag) sequence_map[total_sequence]=insert_temp; ///如果循环没有找到比当前元素大的元素,说明当前元素为最大值,直接加到数组最后一位 total_sequence++; ///顺序表的元素个数增加1个。 printf("顺序表插入成功!"); system("pause"); system("cls"); ///清屏。 init_sequence(); ///调用主界面。 } void output_sequence() ///遍历数组,输出所有元素 { system("cls"); printf("顺序表当前为:\n"); for(int i=0; i<total_sequence; i++) { printf("%d",sequence_map[i]); printf(i==total_sequence-1?"\n":" "); ///先是一个判断语句,若数sequence_map[i]不是最后一位,就输出空格用以分隔,否则输出换行。 } system("pause"); system("cls"); ///清屏。 init_sequence(); ///返回主界面。 } void delete_sequence() ///删除数据和插入原理相似,需要注意如果存在相同元素需要全部删除 { system("cls"); printf("请输入要删除的数据:"); int delete_temp; ///delete_temp 是要删除的数据。 bool flag=false; ///判断顺序表中是否有当前元素 while(~scanf("%d",&delete_temp)) { for(int i=0; i<total_sequence; i++) ///依次检验顺序表中是否存在该数 { if(delete_temp==sequence_map[i]) { total_sequence--; ///如果遇到需要删除的元素,将线性表长度-1 flag=true; ///表示已经删除该元素 for(int k=i; k<=total_sequence-1; k++) ///从这一位开始将后面所有比它大的元素都前移一位 sequence_map[k]=sequence_map[k+1]; i--; ///重点:如果不将i-1,会导致删除完本元素后i向后前进一位 } ///数组元素整体向前前进一位,相当于i+=2,如果此时有相同 } ///需要删除的元素,会跳过这个元素,导致删除不成功,有兴趣 if(!flag) ///可以注释掉i--这一句测试一些数据 { printf("当前顺序表中无此元素,请重新输入:"); continue; ///如果flag值没有发生变化说明顺序表中没有这个元素 } else { printf("顺序表元素删除成功!"); system("pause"); system("cls"); ///清屏。 init_sequence(); ///否则删除成功,重新回到上级菜单 break; } } } void length_sequence() ///顺序表长度。 { system("cls"); printf("当前顺序表长度为:"); printf("%d\n",total_sequence); ///由于用了全局变量统计了顺序表的长度,就不用遍历了 system("pause"); system("cls"); init_sequence(); } void sequence() { system("cls"); init_sequence(); int op_sequence; ///二级菜单中线性表的操作选项 while(~scanf("%d",&op_sequence)) { if(op_sequence==1) establish_sequence(); else if(op_sequence==2) insert_sequence(); else if(op_sequence==3) output_sequence(); else if(op_sequence==4) delete_sequence(); else if(op_sequence==5) length_sequence(); else if(op_sequence==6) return; else { printf("输入非法,请重新输入:"); continue; } } } int main() { init_sequence(); sequence(); }
标签:
原文地址:http://www.cnblogs.com/-beyond/p/5074640.html