顺序表应用-数据结构实验报告x
时间:2020-10-17 20:32:03 来源:勤学考试网 本文已影响 人
大学数据结构实验报告
课程名称 数据结构实验 第(三)次实验 实验名称 顺序表的应用
学生姓名 于歌 专业班级 学号
实验成绩 指导老师(签名) 日期2018年9月30日
一、 实验目的
学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性 表的一些基本操作和具体的函数定义。
掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并 集等运算。
掌握对多函数程序的输入、编辑、调试和运行过程。
二、 实验要求
预习C语言中结构体的定义与基本操作方法。
对顺序表的每个基本操作用单独的函数实现。
编写完整程序完成下面的实验内容并上机运行。
整理并上交实验报告。
三、 实验内容:
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有 如下功能:
(1) 根据指定学生个数,逐个输入学生信息
(2) 逐个显示学生表中所有学生的相关信息
(3) 根据姓名进行查找,返回此学生的学号和成绩
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
(5) 给定一个学生信息,插入到表中指定的位置
(6) 删除指定位置的学生记录
(7) 统计表中学生个数
四、 实验设计
1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功 能:
(1)根据指定学生个数,逐个输入学生信息
for (count=0; count<n; count++)
{
scanf (,/%s%s%d/z, e. no, e. name, &e. score);
Input (&L, e);
} —
Status Input(SqList *L, ElemType e)
if(!(*L). elem)
return ERROR;
(*L). elem[(*L). length++]=e;
return OK;
}
逐个显示学生表中所有学生的相关信息
Status Print (SqList L)
{
printff 学号 姓名 成绩 \n〃);
int count;
for(count^O; count〈L?length; count++)
Pri (L. elem[count]);
return OK;
}
void Pri (ElemType e)
{
printf (,z%8s Iz/, e. no);
printf("%20s I”、e. name);
printf (/z%8d \n \ e. score);
}
根据姓名进行查找,返回此学生的学号和成绩
Status LocateElem(SqList L, ElemType e)
{
int count;
for(count^O; count〈L?length; count++)
if (strcmp (L? elem[count]? name, e. name)二二0)
break;
if (count<L?length)
{
printf r 学号 姓名 成绩 \n〃);
Pri(L. elem[count]);
}
else
printf ("%s在顺序表中查不到! \n", e. name);
return OK;
}
根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
Status LocateNum(SqList L,int i)
{
i.f (i<l i>L. length+1)
return OVERFLOW;
printf C 学号 姓名 成绩 \n");
Pri (L. elem[i-l]) ; 竺
return OK;
}
给定一个学生信息,插入到表中指定的位置
Status Listinsert (SqList *L, int i, ElemType e)
{
int count;
if(i<l i>(*L). length+1)
return OVERFLOW:
if ((*L). length— (*L). MaxSize)
(*L)? elem二(ElemType
*)realloc((*L). elem, sizeof(ElemType)*((*L). MaxSize+LISTINCREMENT)); 辻(!(*L). elem)
exit(OVERFLOW);
for (count= (*L)? lengthT ; count〉二iT; count--)
(*L)? elem[count+l]二(*L)? elem[count];
(*L). elem[i-l]=e;
(*L). length++;
return OK;
}
删除指定位置的学生记录
Status ListDelete (SqList 水L,int i)
{
int count;
if(i<l i>(*L). length+1)
return OVERFLOW;
for (count=i; count< (*L)?length; count++)
(*L)? elem[count一1]二(*L)? elemEcount]:
(*L)?length一一;
return OK;
}
统计表中学生个数
printf C表中学生的个数为:%d\n,,) L. length);
主函数
int main()
{
SqList L;
ElemType e;
int i, count, n, number:
InitList (&L);
printf C请输入学生的个数:\n〃);
scanf (〃%d: &n);
printfC请输入学号、姓名、成绩:\n");
for (count=0; count<n; count++)
scanf (/z%s%s%d/z, e. no, e. name, &e. score);
Input (&L, e);
}
printff学生信息生成成功! \rf);
Pr();
scanf (〃%d〃, &n);
while (n>0&&n<7)
{
switch(n)
{
case 1:
Print(L);
break;
case 2:
printfC请输入要查找的学生的姓名:〃); scanf e. name);
LocateElem(L, e); break;
case 3: printff请输入要查找的学生的位置:〃); scanf (,/%d,,> &i); LocateNum(L, i);
break;
case 4: printff输入插入学生的位置、学号、姓名、成绩:〃); scanf (/z%d%s%s%d,z, &i, e. no, e. name, &e. score); if (Listlnsert (&L, i, e))
printf C插入成功! \n"); break;
case 5:
printf r请输入要删除的学生的位置:\n〃); scanf (z/%d/z, &i);
if(ListDelete(&L,i)) printf ("删除成功! \n");
break;
case 6:
printf C表中学生的个数为:%d\nz/, L. length);
)
Pr();
scanf (/z%dz/, &n);
)
辻(n 二二 7)
printf C退出成功!
:return 0;
}
五、实验测试
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功 能运行界面
5 anCuo Zrvinij XuSb^n Zone Luo ZH? a Liu黔靛霜號sog用电 13 45 67890 0 津 2?:u 功为耋驛isB? 養swxs的的 sf^/l-*谒 聲SXSAA8硕s每牛 f is?i§
5 an
Cuo Zrvinij Xu
Sb^n Zone Luo ZH? a Liu
黔靛霜號sog
用
电 13 45 67890 0 津 2
?:u 功为耋
驛is
B? 養sw
xs的的 sf^/l-*谒 聲
SXSAA
8
硕
s
每牛 f is
?i
§ S 義找;£-戡
功位
的的 银 事a- ?產星遜
SAiA^ ¥卡
I? 部鼠1'生
T姓 旳?
」81 8 心舊…送
9 nirlduz巨 **OZG2XV£ 2L totUA
1
成
0111 574 &- G8-M-S 8 -5 L 7 C4 8<口>6,!2?
ASUS'
旺A.功
睿
8
8
ss.
US
六、总结 附录1:源代码 #mclude <stdio.li> ^include <stdlib.h> #mclude <strmg.h>
^define LIST_INIT_SIZE 100
^define LISTINCREMENT 10
^define OK 1
^define ERROR 0
^define OVERFLOW 2
typedef mt Status;
typedef struct
{
char no[8];
char name[20];
mt score;
} Student;
typedef Student EleinType;
typedef struct
{
ElemType *elem:
mt length;
mt MaxSize;
} SqList;
Status IiiitList(SqList *L)
{
(*L).elem=(ElemType *)malloc(sizeof(ElemT>pe)*LIST_INIT_SIZE); if(?(*L).elem)
exit(OVERFLOW):
(*L).length=0;
CL).MaxSize=LIST_INIT_SIZE;
return OK:
}
Status Iiiput(SqList *L.EleinType e)
{
if(?(*L).elem)
return ERROR;
(*L).elem[(*L).leiigth-H-]=e;
retuni OK:
}
Status ListInsert(SqList *L.int i.EleinType e)
{
mt count;
if(i<l||i>(*L) .lengtli+1)
renim OVERFLOW;
if(( * L) .lengtli==(*L). MaxSize)
(*L).elem=(ElemType
*)realloc((*L).elein,sizeof(ElemType)*((*L).MaxSize+LISTINCREMENT));
exit(OVTRFLOW);
fbr(coiint=(*L).lengtli-l; count>=i-l; count—) (*L).elem[count+l]=(*L).elem[count];
(*L).elem[i-l]=e;
(*L).length++;
return OK;
}
Status ListDelete(SqList *L.mt i)
{
mt count;
if(Kl |i>(*L).lengtli+l)
return OVERFLOW;
for(coiuit=i; coimt<(*L).length: coiuit++) (*L).elem[count-l]=(*L).elem[count];
(*L).length—;
return OK:
}
Status LocateElem(SqList L,ElemType e)
{
mt count;
for(coiint=0: count<L.length: coiuit++) if(strcmp(L.elem[coiint].name.e.name)==0) break;
if(c ount<L length)
成绩 W);成绩
成绩 W);
成绩 \nH);
pnntf(H 学号 姓名
Pn(L.elem[count]);
}
else
pnntf(H%s在顺序表中查不到! \n",e.name);
return OK:
}
Status LocateNum(SqList L.mt i)
{
if(i<l ||i>L.leiigtli+1)
return OVERFLOW;
pnntf(” 学号 姓名
Pri(L.elem[i-l]);
return OK;
}
Status Pnnt(SqList L)
prmtf(H 学号
mt count:
姓洛
成绩 W);
fbr(coiuit=0: count<L.length; coiint++) Pn(L.elem[count]);
return OK:
}
void Pri(ElemType e)
{
prmtf(H%8s |M,e.no); prmtf(H%20s ^^e.name); priiitf(H%8d \Qn,e.score);
}
void Pr()
{
prmtfC^l.输出全部的学生信息5“); prmtf("2.通过姓名査找学号和成绩5”); prmtfC 3通过位置査找学生的信息\n”); pnntf(' 4插入学生信息S");
prmtf("5.删除学生信息S”);
prmtf("6.统计学生个数S”); prmtf(H7.退岀 E);
pnntfC请输入要使用的功能:”);
}
mt inain()
{
SqList L;
ElemType e;
int i^countji.number;
IiiitList(&L);
pnntf(”请输入学生的个数:\n”); scanf(H%d\&n);
pnntf(”请输入学号、姓需、成绩恤”); for(coiuit=0: count<n: count++)
{
scaiif(H%s%s%d,\e.no.e.iiame,&e.score): Input(&L,e);
}
pnntfC学生信息生成成功!
Pr():
scanf(”%d"、&n);
while(n>0&&nv7)
{
switch(n)
{
case 1:
Prmt(L);
break;
case 2:
prmtf("请输入要查找的学生的姓名:”); scanf(n%sH,e.name);
LocateElein(L.e);
break;
case 3:
prmtf("请输入要查找的学生的位置:”); scanf(H%d\&i);
LocateNum(L,i); break;
case 4:
prmtfC输入插入学生的位置、学号、姓名、成绩:“); scanf(”%d%s%s%d",&i,e.no,e.name、&e.score); if(ListInsert(&L,i,e))
pnntf("插入成功! S”);
break;
case 5:
printfC请输入要删除的学生的位巻:S”); scanf(”%cT,&i);
if(ListDelete(&L,i)) pnntf("删除成功! 5”); break;
case 6:
printfC表中学生的个数为:%d5” .L.length);
}
Pr();
scanfC%d".&n);
}
if(n=7)
pnntf(”退岀成功! ”);
renini 0: