赶在最后一天完成了数据结构作业,边学C边学数据结构真的蛋疼
编程实现一个简单学生成绩表的操作。
此系统的功能包括:
查询:按特定的条件查找学生
修改:按学号对某个学生的某门课程成绩进行修改
插入:增加新学生的信息
删除:按学号删除已退学的学生的信息。
学生成绩表的数据如下:
学号 姓名 性别 大学英语 高等数学
2008001 Alan F 93 88
2008002 Danie M 75 69
2008003 Helen M 56 77
2008004 Bill F 87 90
2008005 Peter M 79 86
2008006 Amy F 68 75
要求采用顺序存储结构来实现对上述成绩表的相关操作。
增删查的方法都是按照书上的改的,直接用发现一堆报错,原因如图
C语言错误:request for member ‘xxx’ in something not a structure or union
经过调试才发现是 . 与->使用错了如果他是地址就在使用->给结构体赋值 如果不是地址就使用 . 来赋值
下面是最终代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTCREAMENT 10
#define OVERFLOW -2
//typedef int Student;
typedef int Status;
typedef struct { //定义一个学生结构体
char no[20]; // 学号
char name[20]; // 姓名
char sex[20]; //性别
int price; // 英语成绩
int score; //高数成绩
} Student;
typedef struct {
Student * elem;
int length;
int listsize;
} SqList;
//初始化
Status InitIist(SqList *L) {
L->elem = (Student*)malloc(LIST_INIT_SIZE * sizeof(Student));
if(!L->elem)
exit(OVERFLOW);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 1;
}
Status InsList(SqList *L, int i, Student e) { //插入学生信息
Student * newbase;
if(i<1||i>L->length+1) //检查i是否合法
return 0;
//动态增加空间
if(L->length >= L->listsize){
newbase=(Student*)realloc(L->elem,(L->listsize+LISTCREAMENT)*sizeof(Student));
if(!newbase){
exit(OVERFLOW);
}
L->elem=newbase;
L->listsize+=LISTCREAMENT;
}
//执行插入循环,用j标识,将i后面的数后移一位
int j = 0;
for(j = L->length-1; j>=i-1; j--){
L->elem[j+1] = L->elem[j];
}
L->elem[i-1] = e;
L->length++;
return 1;
}
Status DelList(SqList *L, int i) { //删除指定位置学生记录
if(i<1||i>L->length+1) //检查i是否合法
return 0;
//执行删除循环,用j标识,将i后面的数前移一位
int j = 0;
for(j = i; j<=L->length; j++){
L->elem[j-1] = L->elem[j]; //将后面元素依次前移
}
--L->length;
return 1;
}
int Locatename(SqList *L, Student e) { //按照姓名查找
/*用e返回L中第i个数据元素的值*/
int i;
for(i=0; i<L->length+1; i++) {
if(!strcmp(L->elem[i].name,e.name))
{ //比较两个字符串是否相同
return i+1;
break;
}
}
return 0;
}
int Locateno(SqList *L, Student e) { //按照学号查找
/*用e返回L中第i个数据元素的值*/
int i;
for(i=0; i<L->length+1; i++) {
if(!strcmp(L->elem[i].no,e.no))
{ //比较两个字符串是否相同
return i+1;
break;
}
}
return 0;
}
int main() {
int i,num,a,temp,select,sum=0,c;
SqList L;
InitIist(&L);
Student m,e;
printf("Reading student information:\n");
num = 6;
sum=num;
FILE * fp;
fp = fopen ("file.txt", "w+");
fputs("2008001 Alan F 93 88\r\n", fp);
fputs("2008002 Danie M 75 69\r\n", fp);
fputs("2008003 Helen M 56 77\r\n", fp);
fputs("2008004 Bill F 87 90\r\n", fp);
fputs("2008005 Peter M 79 86\r\n", fp);
fputs("2008006 Amy F 68 75\r\n", fp);
rewind(fp);
for(i=0; i<num; i++)
{
fscanf(fp,"%s %s %s %d %d",L.elem[i].no,L.elem[i].name,L.elem[i].sex,&L.elem[i].price,&L.elem[i].score);
}
fclose(fp);
L.length=num;
printf("\n");
printf("所有学生的相关信息为:\n\n");
for(i=0; i<L.length; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
while(1) {
printf("------------------菜单------------------\n");
printf(" 1-姓名查找\n");
printf(" 2-学号查找\n");
printf(" 3-插入\n");
printf(" 4-删除\n");
printf(" 5-修改学生成绩\n");
printf(" 6-退出系统\n");
printf("------------------菜单------------------\n");
scanf("%d",&num);
switch(num) {
case 1:
printf("请输入你要查找的姓名:");
scanf("%s",e.name);
temp=Locatename(&L,e);
if(temp!=0)
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
else
printf("查找失败!\n\n");
break;
case 2:
printf("请输入你要查询的学号:");
scanf("%s",e.no);
temp=Locateno(&L,e);
if(temp!=0){
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
}else{
printf("查找失败!\n\n");
}
break;
case 3:
printf("请输入你要插入的位置:");
scanf("%d",&a);
printf("请输入插入学生信息:\n");
printf("学号:");
scanf("%s",m.no);
printf("姓名:");
scanf("%s",m.name);
printf("性别:");
scanf("%s",m.sex);
printf("英语成绩:");
scanf("%d",&m.price);
printf("高数成绩:");
scanf("%d",&m.score);
if(InsList(&L,a,m)) {
sum++;
printf("插入成功!\n\n");
} else{
printf("插入失败!\n\n");
}
printf("所有学生的相关信息为:\n\n");
for(i=0; i<L.length; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
break;
case 4:
printf("请输入要删除学生的学号:");
scanf("%s",e.no);
temp=Locateno(&L,e);
if(temp!=0){
if(DelList(&L,temp)) {
sum--;
printf("删除成功!\n\n");
} else{
printf("删除失败!\n\n");
}
}else{
printf("查找失败!\n\n");
}
printf("所有学生的相关信息为:\n\n");
for(i=0; i<L.length; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
break;
case 5: {
printf("请输入你要修改成绩的学生学号:");
scanf("%s",e.no);
temp=Locateno(&L,e);
if(temp!=0) {
printf("请依次输入英语成绩和高数成绩: ");
int a,b;
scanf("%d%d",&a,&b);
L.elem[temp-1].price=a;
L.elem[temp-1].score=b;
printf("修改成功!\n");
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
} else {
printf("输入学号有误,请重新输入\n");
}
}
break;
case 6: {
printf("当前总学生个数为:%d\n\n",sum);
}
printf("当前所有学生的相关信息为:\n\n");
for(i=0; i<L.length; i++) {
printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
}
printf("\n");
printf("退出成功\n");
return 0;
default:
printf("ERROR!\n");
}
printf("\n");
}
return 1;
}
程序截图