更完整的顺序表

发布时间 2023-04-18 20:59:25作者: mo寒流xing

#include<bits/stdc++.h>
#include<string.h>
using namespace std;
#define maxlen 100 //表的最大长度
typedef struct{
int key;
char name[20];
int age;
} Data;//节点的结构
typedef struct{
Data listdata[maxlen];//用于保存结点的结构体数组
int listlen;//节点数量/表的长度
}SLType;//顺序表的结构
int SLInit(SLType* SL)
{
SL->listlen=0;
}//初始一个空表。
int SLLength(SLType*SL){
return SL->listlen;
}//输出表的长度。
int SLInsert(SLType *SL,int n,Data data)
{
int i;
if(SL->listlen>=maxlen)
{
printf("顺序表已满,无法插入\n");
return 0;
}
if(n>SL->listlen||n<1)
{
printf("插入元素序号有误,无法插入\n");
return 0;
}
for(i=SL->listlen;i>=n-1;i--)
{
SL->listdata[i+1]=SL->listdata[i];
}
SL->listdata[n-1]=data;
SL->listlen+=1;//节点数量加一;
cout<<"插入成功!"<<endl;
return 1;
}//插入一个数据
int SLAdd(SLType*SL,Data data)
{
if(SL->listlen>=maxlen)
{
printf("顺序表已满,无法添加");
return 0;
}
else{
SL->listdata[SL->listlen]=data;
SL->listlen++;
cout<<"追加节点成功!"<<endl;
return 1;
}
} //判断顺序表是否已满,在表的末尾添加一个数据。
int SLDelete(SLType *SL,int n)
{
if(n<1||n>SL->listlen)
{
printf("输入节点序号有误,无法删除\n");
return 0;
}
int i=n-1;
for(i;i<SL->listlen;i++)
{
SL->listdata[i]=SL->listdata[i+1];
}
SL->listlen-=1;
cout<<"删除数据成功!"<<endl;
return 1;
}//删除指定数据;
int SLFindByCont(SLType*SL,int key){
int i=0;
for(i;i<=SL->listlen;i++)
{
if(SL->listdata[i].key==key)
{
cout<<"学生姓名:"<<SL->listdata[i].name<<" 学生年龄:"<<SL->listdata[i].age<<endl;
return 0;
}
}
cout<<"未查找到相关信息!"<<endl;
return 0;
} //查找指定数据的序号;
int Printf(SLType *SL)
{
int i;
for(i=0;i<SL->listlen;i++)
{
cout<<"第"<<i+1<<"名学生信息:"<<"学号: "<<SL->listdata[i].key<<"姓名: "<<SL->listdata[i].name<<"年龄: "<<SL->listdata[i].age<<endl;
}
return 0;
}
int main()
{
int i;
SLType SL;//定义顺序表
Data data;//定义节点
char key[10];
SLInit(&SL);
cout<<"初始化顺序表完成"<<endl;
while(1)
{
cout<<"请输入节点(学号 姓名 年龄)"<<endl;
cin>>data.key>>data.name>>data.age;
//fflush(stdin);
if(data.age)
{
if(!SLAdd(&SL,data))
{
break;
}
}
else{
break;
}
}
cout<<endl<<"顺序表的节点顺序:"<<endl;
Printf(&SL);//输出已录入的学生;
int flag;
while(1)
{
cout<<"请选择接下来的操作:追加节点(1),插入节点(2),删除节点(3),查看已有的节点数量(4),输出全部数据(5),查找信息(6)结束操作(7)"<<endl;
cin>>flag;
if(flag==1)
{
Data data;
cout<<"输入追加的学生学号、姓名、年龄:"<<endl;
cin>>data.key>>data.name>>data.age;
SLAdd(&SL,data);
}
if(flag==2)
{
int i;
Data data;
cout<<"请输入希望插入的位置(整数)及学生学号、姓名、年龄:"<<endl;
cin>>i>>data.key>>data.name>>data.age;
SLInsert(&SL,i,data);
}
if(flag==3)
{
int i;
cout<<"请输入删除的节点序号(整数): "<<endl;
cin>>i;
SLDelete(&SL,i);
}
if(flag==4)
{
cout<<"已有的节点个数:"<<SLLength(&SL)<<endl;
}
if(flag==5)
{
Printf(&SL);
}
if(flag==6)
{
int i;
cout<<"按学号查找(1)按姓名查找(2)"<<endl;
cin>>i;
if(i==1)
{
int key;
cout<<"请输入学号: "<<endl;
cin>>key;
SLFindByCont(&SL,key);
}
//按姓名查找else
}
if(flag==7)
{
cout<<"感谢使用!"<<endl;
break;
}
}
return 0;
}

总结:

今天解决了在录入数据后因为节点数量导致无法正常输出的问题;

对数组下标和实际需要的序号进行了改进;

增加了多分支操作;

仍存在的问题:

对于标红加粗的语句理解不深;

剩余按姓名查找的函数未写(明日再写);

按学号查找由字符串类型更换为int类型,对于字符串函数的理解应用不足,导致查找函数无法编译;