实验目的 :
1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:
定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
真是烦人的作业昂,VC编译不成功,用的DEV,再看看&怎么用吧。
可是不就是这个吗????。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define Error 0
#define OverFlow 2
#define MAXSIZE 256
typedef struct {
char id[8]; //学号 student number
char name[32];//姓名
double score;//成绩
} Student;
typedef struct {
Student *Base;//基地址 base address
int Length;//长度
} SqList;
SqList L;
void notice() {//提示信息
puts("\t\t\t1. 学生信息表的录入");
puts("\t\t\t2. 学生信息表的浏览");
puts("\t\t\t3. 按姓名进行查找");
puts("\t\t\t4.按指定位置进行查找");
puts("\t\t\t5.学生个人信息的插入");
puts("\t\t\t6.学生个人信息的删除");
puts("\t\t\t7. 统计表中学生个数");
printf("\t\t\t0. 退 出 系 统\n");
printf("请键入数字指令:");
}
Student Infor[MAXSIZE];//information
int InitList(SqList &L) {//构造空的顺序表
L.Base = Infor;
if(!L.Base) exit(OverFlow);//由于存储分配失败导致退出
L.Length = 0;
return OK;
}
void PrintfInfor() {
// (2) 逐个显示学生表中所有学生的相关信息;
int i;
printf("当前学生编号\t姓名\t学号\t成绩\n");
for(i = 0; i < L.Length; i++) {
printf("\t%d", i + 1);
printf("\t%s", Infor[i].name);
printf("\t%s", Infor[i].id);
printf("\t %.2lf\n", Infor[i].score);
}
puts("已成功显示全部学生信息!");
}
int FindList(SqList L, char StudentName[]) {
// (3) 根据姓名进行查找,返回此学生的学号和成绩;
int i;
for(i = 0; i < L.Length; i++)
if(strcmp(Infor[i].name, StudentName) == 0) return i + 1;
return Error;
}
int GetValue(SqList L, int i, Student &e) {//顺序表的取值
// (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
if(i < 1|| i > L.Length) return Error;
e = Infor[i-1];
return OK;
}
int ListInsert(SqList &L, int i, Student e) {
// (5) 给定一个学生信息,插入到表中指定的位置;
int j;
if((i < 1)||(i > L.Length)) return Error;//i 的取值不合法
if(L.Length == MAXSIZE) return Error;
for(j = L.Length - 1; j >= i - 1; j--) {
Infor[j+1] = Infor[j];
}
Infor[i-1] = e;
++L.Length;
return OK;
}
int ListDel(SqList &L, int i) {
// (6) 删除指定位置的学生记录;
int j;
if((i < 1)||(i > L.Length)) return Error;//i 的取值不合法
for(j = 1; j <= L.Length - 1; j++) {
Infor[j-1] = Infor[j];
}
--L.Length;
return OK;
}
void StatisticsNum() {
// (7) 统计表中学生的总个数
printf("表中学生信息信息数目是:%d条.\n", L.Length);
}
void DealDeta() {//处理信息数据的函数
int k, flag, p;//操作指令,循环操作标志量,提示信息标志量
int NumStu, i, dd;//学生人数, i, 接受函数返回值
char StudentName[32];//查找的学生姓名
Student Temp;
p = 1;
notice();
flag = 1;
while(flag) {
if(p>1)
notice();
scanf("%d", &k);
switch(k) {
case 0: {
flag = 0;
puts("谢谢翟老师的审阅!");
break;
}
case 1: {
if(InitList(L) == OK) {
puts("\t\t成功构建学生信息顺序表!");
printf("请键入需要录入的学生人数:\t");
scanf("%d", &NumStu);
L.Length = NumStu;
for(int i = 0; i < NumStu; i++) {
printf("当前第 %d 个学生信息的录入:\n", i + 1);
printf("\t姓名:");
scanf("%s", Infor[i].name);
printf("\t学号:");
scanf("%s", Infor[i].id);
printf("\t成绩: ");
scanf("%lf", &Infor[i].score);
}
puts("\t\t\t录入完成!");
} else puts("构建未完成,可能由于存储分配失败的原因。请检查...");
break;
}
case 2: {
PrintfInfor();
break;
}
case 3: {
printf("请键入需要查找信息的学生姓名:");
scanf("%s", StudentName);
dd = FindList(L, StudentName);
if(dd) {
printf("当前学生的学号是:%s, 成绩是:%.2lf\n", Infor[dd].name, Infor[dd].score);
} else {
puts("输入有误,请重新输入!");
}
break;
}
case 4: {
printf("请键入需要查询的位置:");
scanf("%d", &NumStu);
dd = GetValue(L, NumStu, Temp);
if(dd == Error) puts("请检查输入是否有误!");
else {
printf("\t%s", Temp.name);
printf("\t%s", Temp.id);
printf("\t %.2lf\n", Temp.score);
}
break;
}
case 5: {
printf("\t请键入插入的位置:");
scanf("%d", &i);
printf("\t插入学生的姓名:");
scanf("%s", Temp.name);
printf("\t插入学生的学号:");
scanf("%s", Temp.id);
printf("\t插入学生的成绩: ");
scanf("%d", &Temp.score);
dd = ListInsert(L, i, Temp);
if(dd == Error) puts("插入成功!");
else printf("插入失败,请检查顺序表的长度和数据的键入\n");
break;
}
case 6: {
printf("\t请键入需要删除学生信息的位置:");
scanf("%d", &i);
dd = ListDel(L, i);
if(dd == OK) {
printf("删除成功!\n");
} else {
printf("删除失败,请检查键入数据的合法性\n");
}
break;
}
case 7: {
StatisticsNum();
break;
}
default: {
puts("请正确键入命令前的标志数字 0 ~ 7.");
break;
}
}
p=1103;
puts("\n");
}
}
int main() {
DealDeta();
return 0;
}
123

被折叠的 条评论
为什么被折叠?



