考研要点之顺序表(详细实现)
作者:
Bear_King
,
2022-07-09 10:37:08
,
所有人可见
,
阅读 346
线性表顺序存储结构完整版实现
#include<iostream>
#define OK 10
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
using namespace std;
typedef char DataType;
typedef struct
{
DataType data[MAXSIZE];/*注意表值与下表值的对应关系*/
int last;/*data数组中最后一位存储单元的对应下标值*/
}SeqList;
/*建表:建立新表并初始化位空表*/
SeqList* CreateList()
{
char c;
SeqList *Lq;
Lq = new SeqList;
Lq->last = -1;
FLAG:
cout<<"空表已建立完成,请问您是否对它进行赋值操作?"<<endl<<"(是:Y/y,否:N/n)";
cin>>c;
if(c == 'Y' || c == 'y')
{
int n;
system("cls");
cout<<"请输入你想要输入数据的长度:"<<endl;
cin>>n;
for(int i = 0;i < n;i ++)
{
cout<<"请输入第"<<i+1<<"个数据"<<endl;
cin>>Lq->data[i];
Lq->last ++;
}
return Lq;
}
else
if(c == 'N' || c == 'n')
{
return Lq;
}
else
{
cout<<"输入不合法,请再次输入!!"<<endl;
goto FLAG;
}
}
/*按位插入:把x插入i位置*/
bool InsertList(SeqList* L,int i,DataType x)/*注意i是表值不是下标值*/
{
int j;
if(L->last + 1 < i || i < 1)/*检查插入位置的合法性*/
{
cout<<"所选插入位置不在范围内!"<<endl;
return ERROR;
}
if(L->last == MAXSIZE - 1) /*检查表是否满*/
{
cout<<"顺序表已满!"<<endl;
return ERROR;
}
for(j = L->last;j >= i - 1;j --)/*从最后一项到第i项的所有数据依次往后移动一个存储单元*/
{
L->data[j+1] = L->data[j];
}
L->data[i-1] = x;
L->last ++;
return OK;
}
/*按位删除:把i的数据移除*/
bool DeteList(SeqList* L,int i)
{
int j;
if(L->last + 1 < i || i < 1)/*检查删除位置的合法性*/
{
cout<<"要删除的位置不存在!"<<endl;
return ERROR;
}
for(j = i;j <= L->last;j ++)/*从第i项开始到最后一项依次往前移动一位*/
{
L->data[j-1] = L->data[j];
}
L->last --;
return OK;
}
/*显示表中所有数据*/
bool ShowList(SeqList* L)
{
int i;
cout<<"当前表内所有数据如下:"<<endl;
for(i = 0;i <= L->last;i ++)
{
cout<<"第"<<i+1<<"个数据:";
cout<<L->data[i]<<endl;
}
return OK;
}
/*按值查找*/
int SearchList(SeqList* L,DataType x)
{
int i = 0;
while(i <= L->last && L->data[i] != x)
{
i ++;
}
if(i > L->last)
{
return ERROR;
}
else
{
return i;
}
}
/*显示表中数据长度(个数)*/
bool LengthList(SeqList* L)
{
cout<<"当前表中数据个数位 : "<<L->last+1;
return OK;
}
/*退出系统*/
bool Exit()
{
char c;
FLAG:
cout<<"请再次确认是否退出?"<<endl<<"(是:Y/y,否:N/n)"<<endl;
cin>>c;
if(c == 'N' || c == 'n')
return FALSE;
else
if(c == 'Y' || c == 'y')
{
exit(0);
cout<<"退出成功!"<<endl<<"欢迎下次使用!"<<endl;
}
else
{
goto FLAG;
}
}
/*菜单*/
void menu()
{
SeqList *L;
int choice;
while(1)
{
cout<<"\t※↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓※"<<endl;
cout<<"\t→***********线性表子系统************←"<<endl;
cout<<"\t→* 1-------建立空的线性表 *←"<<endl;
cout<<"\t→* 2-------往线性表中插入元素 *←"<<endl;
cout<<"\t→* 3-------对线性表中进行指定删除 *←"<<endl;
cout<<"\t→* 4-------显示当前内存中的所有数值*←"<<endl;
cout<<"\t→* 5-------查找线性表中具体元素 *←"<<endl;
cout<<"\t→* 6-------显示当前线性表的长度 *←"<<endl;
cout<<"\t→* 7-------退出界面 *←"<<endl;
cout<<"\t→***********************************←"<<endl;
cout<<"\t※↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑※"<<endl;
cout<<endl<<"请输入菜单号<1 ~ 7> : ";
FLAG:
cin>>choice;
if(choice < 8 && choice > 0)
switch(choice)
{
case 1:
L = CreateList();
if(L) cout<<"创建完成!"<<endl;
else cout<<"创建失败!"<<endl;
break;
case 2:
int n;
char c;
cout<<"请输入你想要插入表中的具体位置:"<<endl;
cin>>n;
cout<<"请输入你想要插入具体位置的具体数据:"<<endl;
cin>>c;
if(InsertList(L,n,c)) cout<<"插入完成!"<<endl;
else cout<<"插入失败!"<<endl;
break;
case 3:
int m;
cout<<"请输入你想要删除的具体位置:"<<endl;
cin>>m;
if(DeteList(L,m)) cout<<"删除完成!"<<endl;
else cout<<"删除失败!"<<endl;
break;
case 4:
system("cls");
if(ShowList(L)) cout<<"显示完成!"<<endl;
else cout<<"显示失败!"<<endl;
break;
case 5:
char d;
cin>>d;
if(SearchList(L,d)) cout<<"查找完成!"<<endl;
else cout<<"查找失败!"<<endl;
break;
case 6:
if(LengthList(L)) cout<<"显示长度完成!"<<endl;
else cout<<"显示长度失败!"<<endl;
break;
case 7:
Exit();
break;
}
else
{
cout<<"输入指令不合法,请重新输入!!"<<endl;
goto FLAG;
}
}
}
int main()
{
menu();
return 0;
}
/*
创建线性表:CreateList()
求线性表的长度:LengthList(L)
按值查找:SearchList(SeqList* L,Datatype x)
插入操作:InList(L,i,x)
删除操作:DeleList(L,i)
显示操作:ShowList(L)
*/