数据结构-顺序表实现学生成绩信息管理
题目要求
函数实现
1. 结构体定义
typedef struct
{
char name[10]; //学生姓名
char number[15]; //10位学生学号,如果只是10会不够!!
int score_c; //学生C语言成绩
int score_s; //学生数据结构成绩
}Student;
typedef struct
{
Student elem[100]; //基地址
int length; //结构体当前长度
int listsize; //结构体最大长度
}Sqlist,*Seqlist;//结构体类型名
2. 初始化顺序表
void InitList(Seqlist L) //初始化线性表:构造一个空的线性表
{
//L = (Seqlist)malloc(MAXSIZE*sizeof(Sqlist));
L->length = 0;
L->listsize = MAXSIZE;
}
3. 求顺序表长度
int ListLength(Seqlist L) //求线性表的长度:返回L中元素个数n。
{
return L->length;
}
4. 判断顺序表是否为空
void ListEmpty(Seqlist L) //判断线性表是否为空表:若L为空表, 返回TRUE,否则返回FALSE
{
if(L->length==0)
printf("TRUE");
else
printf("FALSE");
printf("\n");
}
5. 查找
void GetElem(Seqlist L,int i) //求线性表L中指定位置的某个数据元素:根据学生节点查找学生信息
{
printf("查找的学生的信息:\n");
printf("姓名:%s\n学号:%s\n C语言成绩:%d\n数据结构成绩:%d\n",L->elem[i-1].name,L->elem[i-1].number,L->elem[i-1].score_c,L->elem[i-1].score_s);
}
6. 取前驱
void PriorElem(Seqlist L, int cur_e) //取cur_e的前驱结点
{
printf("这个学生前一个学生的信息:\n");
printf("姓名:%s\n学号:%s\nC语言成绩:%d\n数据结构成绩:%d\n",L->elem[cur_e-2].name,L->elem[cur_e-2].number,L->elem[cur_e-2].score_c,L->elem[cur_e-2].score_s);
}
7. 取后继
void NextElem(Seqlist L, int cur_e) //取cur_e的后继结点
{
printf("这个学生后一个学生的信息:\n");
printf("姓名:%s\n学号:%s\nC语言成绩:%d\n数据结构成绩:%d\n",L->elem[cur_e].name,L->elem[cur_e].number,L->elem[cur_e].score_c,L->elem[cur_e].score_s);
}
8. 插入节点
void ListInsert(Seqlist &L,int i) //插入一个数据元素:在L的第i个元素之前插入新的元素e,L的长度增1
{
int j;
for(j=L->length;j>=i-1;j--)
L->elem[j+1] = L->elem[j];
printf("请输入需要插入学生的信息:\n");
printf("姓名:");
scanf("%s",&L->elem[i-1].name);
printf("学号:");
scanf("%s",&L->elem[i-1].number);
printf("C语言成绩:");
scanf("%d",&L->elem[i-1].score_c);
printf("数据结构成绩:");
scanf("%d",&L->elem[i-1].score_s);
++L->length;
printf("\n");
}
9. 删除节点
void ListDelete(Seqlist L,int i) //删除数据元素:删除L的第i个元素,L的长度减1
{
int j;
for(j=i;j<=L->length-1;j++)
L->elem[j-1] = L->elem[j];
L->length--;
}
10. 打印顺序表
void displist(Seqlist L)//打印学生信息
{
printf("打印当前学生信息:\n");
int i;
for( i=1;i<=L->length;i++)
{
printf("姓名:%s\n",L->elem[i-1].name);
printf("学号:%s\n",L->elem[i-1].number);
printf("C语言成绩:%d\n",L->elem[i-1].score_c);
printf("数据结构成绩:%d\n",L->elem[i-1].score_s);
}
printf("\n");
}
11. 学生信息的输入
void inputlist(Seqlist L)//学生信息的输入
{
int i,n;
printf("请输入学生的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学生的信息:\n");
printf("姓名:");
scanf("%s",&L->elem[i].name);
printf("学号:");
scanf("%s",&L->elem[i].number);
printf("C语言成绩:");
scanf("%d",&L->elem[i].score_c);
printf("数据结构成绩:");
scanf("%d",&L->elem[i].score_s);
L->length++;
}
printf("\n");
}
主函数
int main()//学生信息管理系统的主函数
{
Sqlist L1;
Seqlist L=&L1;
int k;
int i; //为case语句用
InitList(L);//建立一个空的顺序线性表
inputlist(L);//输入学生的信息。
printf("\n");
displist(L);//打印学生的信息。
printf("学生信息输入成功!\n");
printf("\n");
printf("学生信息管理系统的操作目录:\n");
printf("__________________________\n");
printf("__________________________\n");
printf("0、退出选择;1、根据学生的结点位置查找学生信息;2、判断顺序表是否为空;3、插入学生的信息;4、删除学生的信息;5、求表中学生的总数。6、求前驱;7、求后继\n");
printf("__________________________\n");
while(1)
{
printf("请选择操作:");
scanf("%d",&k);
switch(k)
{
case 0:printf("谢谢使用!");exit(0);
case 1:printf("请输入你要查找的学生位序:");scanf("%d",&i);GetElem(L,i);break; //按位序查找学生信息
case 2:ListEmpty(L);break; //判断学生信息顺序表是否为空
case 3:printf("请输入你要插入学生的位置:");scanf("%d",&i);ListInsert(L,i);displist(L);break; //插入学生信息后打印当前学生顺序表信息
case 4:printf("请输入你要删除学生的位序:");scanf("%d",&i);ListDelete(L,i);displist(L);break; //删除学生信息后打印当前学生顺序表信息
case 5:printf("该表中学生总数:%d\n",ListLength(L));break;//求顺序表学生总数
case 6:printf("输入当前学生位序:");scanf("%d",&i);PriorElem(L,i);break; //求当前学生的前驱:即前一个学生的信息
case 7:printf("输入当前学生位序:");scanf("%d",&i);NextElem(L,i);break; //求当前学生的后继:即后一个学生的信息
}
}
return 0;
}
完整代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define MAXSIZE 100
typedef struct
{
char name[10]; //学生姓名
char number[15]; //10位学生学号,如果只是10会不够!!
int score_c; //学生C语言成绩
int score_s; //学生数据结构成绩
}Student;
typedef struct
{
Student elem[100]; //基地址
int length; //结构体当前长度
int listsize; //结构体最大长度
}Sqlist,*Seqlist;//结构体类型名
void InitList(Seqlist L) //初始化线性表:构造一个空的线性表
{
//L = (Seqlist)malloc(MAXSIZE*sizeof(Sqlist));
L->length = 0;
L->listsize = MAXSIZE;
}
int ListLength(Seqlist L) //求线性表的长度:返回L中元素个数n。
{
return L->length;
}
void ListEmpty(Seqlist L) //判断线性表是否为空表:若L为空表, 返回TRUE,否则返回FALSE
{
if(L->length==0)
printf("TRUE");
else
printf("FALSE");
printf("\n");
}
void GetElem(Seqlist L,int i) //求线性表L中指定位置的某个数据元素:根据学生节点查找学生信息
{
printf("查找的学生的信息:\n");
printf("姓名:%s\n学号:%s\n C语言成绩:%d\n数据结构成绩:%d\n",L->elem[i-1].name,L->elem[i-1].number,L->elem[i-1].score_c,L->elem[i-1].score_s);
}
void PriorElem(Seqlist L, int cur_e) //取cur_e的前驱结点
{
printf("这个学生前一个学生的信息:\n");
printf("姓名:%s\n学号:%s\nC语言成绩:%d\n数据结构成绩:%d\n",L->elem[cur_e-2].name,L->elem[cur_e-2].number,L->elem[cur_e-2].score_c,L->elem[cur_e-2].score_s);
}
void NextElem(Seqlist L, int cur_e) //取cur_e的后继结点
{
printf("这个学生后一个学生的信息:\n");
printf("姓名:%s\n学号:%s\nC语言成绩:%d\n数据结构成绩:%d\n",L->elem[cur_e].name,L->elem[cur_e].number,L->elem[cur_e].score_c,L->elem[cur_e].score_s);
}
void ListInsert(Seqlist &L,int i) //插入一个数据元素:在L的第i个元素之前插入新的元素e,L的长度增1
{
int j;
for(j=L->length;j>=i-1;j--)
L->elem[j+1] = L->elem[j];
printf("请输入需要插入学生的信息:\n");
printf("姓名:");
scanf("%s",&L->elem[i-1].name);
printf("学号:");
scanf("%s",&L->elem[i-1].number);
printf("C语言成绩:");
scanf("%d",&L->elem[i-1].score_c);
printf("数据结构成绩:");
scanf("%d",&L->elem[i-1].score_s);
++L->length;
printf("\n");
}
void ListDelete(Seqlist L,int i) //删除数据元素:删除L的第i个元素,L的长度减1
{
int j;
for(j=i;j<=L->length-1;j++)
L->elem[j-1] = L->elem[j];
L->length--;
}
void displist(Seqlist L)//打印学生信息
{
printf("打印当前学生信息:\n");
int i;
for( i=1;i<=L->length;i++)
{
printf("姓名:%s\n",L->elem[i-1].name);
printf("学号:%s\n",L->elem[i-1].number);
printf("C语言成绩:%d\n",L->elem[i-1].score_c);
printf("数据结构成绩:%d\n",L->elem[i-1].score_s);
}
printf("\n");
}
void inputlist(Seqlist L)//学生信息的输入
{
int i,n;
printf("请输入学生的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学生的信息:\n");
printf("姓名:");
scanf("%s",&L->elem[i].name);
printf("学号:");
scanf("%s",&L->elem[i].number);
printf("C语言成绩:");
scanf("%d",&L->elem[i].score_c);
printf("数据结构成绩:");
scanf("%d",&L->elem[i].score_s);
L->length++;
}
printf("\n");
}
int main()//学生信息管理系统的主函数
{
Sqlist L1;
Seqlist L=&L1;
int k;
int i; //为case语句用
InitList(L);//建立一个空的顺序线性表
inputlist(L);//输入学生的信息。
printf("\n");
displist(L);//打印学生的信息。
printf("学生信息输入成功!\n");
printf("\n");
printf("学生信息管理系统的操作目录:\n");
printf("__________________________\n");
printf("__________________________\n");
printf("0、退出选择;1、根据学生的结点位置查找学生信息;2、判断顺序表是否为空;3、插入学生的信息;4、删除学生的信息;5、求表中学生的总数。6、求前驱;7、求后继\n");
printf("__________________________\n");
while(1)
{
printf("请选择操作:");
scanf("%d",&k);
switch(k)
{
case 0:printf("谢谢使用!");exit(0);
case 1:printf("请输入你要查找的学生位序:");scanf("%d",&i);GetElem(L,i);break; //按位序查找学生信息
case 2:ListEmpty(L);break; //判断学生信息顺序表是否为空
case 3:printf("请输入你要插入学生的位置:");scanf("%d",&i);ListInsert(L,i);displist(L);break; //插入学生信息后打印当前学生顺序表信息
case 4:printf("请输入你要删除学生的位序:");scanf("%d",&i);ListDelete(L,i);displist(L);break; //删除学生信息后打印当前学生顺序表信息
case 5:printf("该表中学生总数:%d\n",ListLength(L));break;//求顺序表学生总数
case 6:printf("输入当前学生位序:");scanf("%d",&i);PriorElem(L,i);break; //求当前学生的前驱:即前一个学生的信息
case 7:printf("输入当前学生位序:");scanf("%d",&i);NextElem(L,i);break; //求当前学生的后继:即后一个学生的信息
}
}
return 0;
}
最终结果
a.信息输入
b.查找学生信息
c.判断是否为空
d.插入学生信息、打印当前顺序表并求学生总数
e.求前驱
f.求后继
g.删除学生信息、打印当前顺序表并求学生总数
h.退出选择