1111

实验目的

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;
}







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值