在实验课上,要求操作线性表的基本操作及其应用,这是第一次实验,用到得是顺序表结构。
课程名:数据结构
实验目的:(1)掌握线性表的定义;
(2)掌握线性表的基本操作,如建立、查找、插入和删除等。
实验要求:定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1)根据指定学生个数,逐个输入学生信息;
(2)逐个显示学生表中所有学生的相关信息;
(3)根据姓名查找,返回此学生的学号和成绩;
(4)根据指定的位置可返回相应的学生信息(学号,成绩,姓名);
(5)给定一个学生信息,插入到表中指定的位置;
(6)删除指定位置的学生记录;
(7)统计表中学生个数。
实验题目:线性表的基本操作及其应用
实验过程:按照实验要求编写相应程序代码,并调试运行。
附:顺序表的主函数代码。
首先初始化顺序表,也就是构造一个空的顺序表。
【算法描述】
Status InitList(SqList &L)//构造空的顺序表L
{
L.elem=new ElemType[MAXSIZE]; //分配一个大小为MAXSIZAE的数组空间
if(!L.elem) exit(OVERFLOW); //存储分配失败退出
L.length=0; //空表长度为0
return OK;
}
取值:根据指定的位置序号i,获取顺序表中第i个数据元素的值。这个获取,可以通过数组下标定位得到,elem[i-1]单元存储第i个数据元素。
【算法描述】
Status GetElem(SqList L,int i,ElemType &e)
{
if(i<1||i>L.length) return ERROR; //判断i值是否合理
e=L.elem[i-1];
return OK;
}
查找:根据指定的元素值e,查找顺序表中第1个与i相等的元素。若查找成功,则返回该元素在表中的位置序号;若失败,返回0。
【算法描述】
int LocateElem(SqList L,ElemType e)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e
return i+1; //查找成功
return 0; //查找失败
}
插入:在表的第i个位置插入一个新的数据元素e,使长度为n的线性表变为长度为n+1的线性表。
【算法描述】
Status ListInsert(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
for(j=L.length-1;j>i-1;j--)
L.elem[j+1]=L.elem[j]; //插入的位置及之后的元素后移
L.elem[i-1]=e; //将新元素e放到第i个位置
++L.length; //表长加1
return OK;
}
删除:将表中的第i个元素删去,将长度为n的线性表变成长度为n-1的线性表。
【算法描述】
Status ListDelete(SqList &L,int i)
{
if(i<1||i>L.length) return ERROR;
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1;
return OK;
}
以上就是将要用到的顺序线性表的一些基本操作及其相关算法。下面我们就对这次实验的要求所写的程序进行编写:
有了上面的基本操作,剩下的就是主函数部分,当然,你也可以对这些基本操作进行适当的修改,不过在写主函数之前,还得对这个表进行输入东西,输入的是什么呢?肯定就是实验要求的东西啦,本次实验输入的就是一些学生信息(姓名,学号,成绩)。
【算法描述】
void Input(ElemType *e) //输入
{
printf("姓名:");
scanf("%s",e->name);
printf("学号:");
scanf("%s",e->no);
printf("成绩:");
scanf("%d",&e->score);
printf("输入完成\n\n");
}
当然,有输入就要有输出,不然输入的东西有什么意义呢?不过,在程序中,就算没有输入,也至少有一个输出,即只要是程序,就会要输出。输出的算法如下:
【算法描述】
void Output(ElemType &e) //输出
{
printf("姓名:%s\n学号:%s\n成绩:%d\n\n",e.name,e.no,e.score);
}
现在就只剩主函数部分了,那就直接上完整的代码:
【完整代码】
#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status; // 定义函数返回值类型
typedef struct
{
char no[8]; // 学号
char name[20]; // 姓名
int score; // 成绩
}student;
typedef student ElemType;
typedef struct
{
ElemType *elem; // 存储空间的基地址
int length; // 当前长度
}SqList;
Status InitList(SqList *L) // 构造空的顺序表 L
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
if(!L->elem) exit(OVERFLOW); //分配失败退出
L->length=0; //长度为0
return OK;
}
ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e
{
return L.elem[i];
}
int Search(SqList &L,char str[]) // 根据名字查找,返回该同学在顺序表中的编号
{
for(int i=1;i<=L.length;i++) //查找成功,返回序号 i+1
{
if(strcmp(L.elem[i].name,str)==0)
return i;
}
return 0;
}
Status ListInsert(SqList &L,int i,ElemType e) // 在 i位置插入某个学生的信息
{
if((i<1)||(i>L.length+1)) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(int j=L.length;j>=i;j--)
{
L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
}
L.elem[i]=e; //将新元素e放入第i个位置
++L.length;
return OK;
}
Status ListDelete(SqList &L,int i) // 在顺序表中删除 i位置的学生信息
{
if((i<1)||(i>L.length)) return ERROR;
for(int j=i;j<=L.length;j++)
{
L.elem[j]=L.elem[j+1]; //被删除元素之后的元素前移
}
--L.length; //长度减一
return OK;
}
void Input(ElemType *e) //输入
{
printf("姓名:");
scanf("%s",e->name);
printf("学号:");
scanf("%s",e->no);
printf("成绩:");
scanf("%d",&e->score);
printf("输入完成\n\n");
}
void Output(ElemType &e) //输出
{
printf("姓名:%s\n学号:%s\n成绩:%d\n\n",e.name,e.no,e.score);
}
int main()
{
SqList L;
ElemType a,b,c,d;
printf("1. 构造顺序表\n");
printf("2. 录入指定人数的学生信息\n");
printf("3. 显示学生表中的所有信息\n");
printf("4. 根据姓名查找该学生,并返回学号和成绩\n");
printf("5. 根据某指定位置显示该学生信息\n");
printf("6. 在指定位置插入学生信息\n");
printf("7. 在指定位置删除学生信息\n");
printf("8. 统计学生个数\n");
printf("0. 退出\n");
int x,choose;
while(1)
{
printf("请输入你要选择的功能前的序号:");
scanf("%d",&choose);
if(choose==0) break;
switch(choose)
{
case 1:
if(InitList(&L))
printf("成功建立顺序表\n");
else
printf("顺序表建立失败\n");
break;
case 2:
printf("请输入要录入学生的人数:");
scanf("%d",&x);
for(int i=1;i<=x;i++)
{
printf("第%d个学生:\n",i);
Input(&L.elem[i]);
}
L.length=x;
break;
case 3:
for(int i=1;i<=x;i++)
{
a=GetElem(L,i);
Output(a);
}
break;
case 4:
char s[20];
printf("请输入要查找的学生姓名:");
scanf("%s",s);
if(Search(L,s))
Output(L.elem[Search(L,s)]);
else
printf("对不起,查无此人\n");
printf("");
break;
case 5:
printf("请输入要查询的位置:");
int id1;
scanf("%d",&id1);
b=GetElem(L,id1);
Output(b);
break;
case 6:
printf ("请输入要插入的位置:");
int id2;
scanf("%d",&id2);
printf("请输入学生信息:\n");
Input(&c);
if(ListInsert(L,id2,c))
{
x++;
printf("插入成功\n");
}
else
{
printf("插入失败\n");
}
break;
case 7:
printf("请输入要删除的位置:");
int id3;
scanf("%d",&id3);
if(ListDelete(L,id3))
{
x--;
printf("删除成功\n");
}
else
{
printf("删除失败\n");
}
break;
case 8:
printf("已录入的学生个数为:%d\n\n",L.length);
break;
}
}
printf("\n\n请按任意键退出\n\n");
return 0;
}
代码就是这样,如果有什么错误的地方,恳请大牛们指出纠正,非常感谢!
【参考文献】:《数据结构》(C语言版|第2版)严蔚敏 李冬梅 吴伟民编著