标签:
#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