问题描述:
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct{
char no[20]; // 学号
char name[20]; // 姓名
int price; // 成绩
}Student;
typedef struct{
Student elem[MAXSIZE]; //线性表占用的数组空间
int last; //最后一个元素的下标
}SeqList;
int Locate(SeqList *L,Student e) //按照姓名查找
{
/*用e返回L中第i个数据元素的值*/
int i;
for(i=0;i<L->last+1;i++)
{
if(!strcmp(L->elem[i].name,e.name)) //比较两个字符串是否相同
return i+1;
}
return 0;
}
int InsList(SeqList *L,int i,Student e) //插入学生信息
{
/*在L中第i个位置之前插入新的数据元素e,L的长度加1*/
int k;
if(i<1||(i>L->last+2))
{
return 0;
}
for(k=L->last;k>=i-1;k--) //元素向后移动位置
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
L->last++;
return 1;
}
int DelList(SeqList *L,int i) //删除指定位置学生记录
{
int k;
if(i<1||i>L->last+1)
return 0;
for(k=i;k<=L->last;k++)
{
L->elem[k-1]=L->elem[k]; //将后面元素依次前移
}
L->last--;
return 1;
}
int main()
{
int i,x,a,temp,select,sum=0,c;
SeqList L;
Student m,e;
printf("********************************************************************\n");
printf("* 1. 根据指定学生个数,逐个输入学生信息; *\n");
printf("* 2. 逐个显示学生表中所有学生的相关信息; *\n");
printf("* 3. 根据姓名进行查找,返回此学生的学号和成绩; *\n");
printf("* 4. 根据指定的位置返回相应的学生信息(学号,姓名,成绩); *\n");
printf("* 5. 给定一个学生信息,插入到表中指定的位置; *\n");
printf("* 6. 删除指定位置的学生记录; *\n");
printf("* 7. 统计表中学生个数; *\n");
printf("* 8. 退出。 *\n");
printf("********************************************************************\n");
printf("\n");
while(select)
{
printf("请选择你要操作的选项:");
scanf("%d",&select);
printf("\n");
switch(select)
{
case 1:
printf("请输入学生的数量:");
scanf("%d",&x);
printf("\n");
sum=x;
for(i=0;i<x;i++)
{
printf("第%d位学生信息\n",i+1);
printf("\n");
printf("学号:");
scanf("%s",L.elem[i].no);
printf("-----------------------------\n");
printf("姓名:");
scanf("%s",L.elem[i].name);
printf("-----------------------------\n");
printf("成绩:");
scanf("%d",&L.elem[i].price);
printf("-----------------------------\n");
}
L.last=x;
printf("\n");
break;
case 2:
printf("所有学生的相关信息为:\n\n");
for(i=0;i<L.last;i++)
{
printf("学号:%s 姓名:%s 成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].price);
}
printf("\n");
break;
case 3:
printf("请输入你要查找的姓名:");
scanf("%s",e.name);
temp=Locate(&L,e);
if(temp!=0)
printf("学号:%s 成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].price);
else
printf("查找失败!\n\n");
break;
case 4:
printf("请输入你要查询的位置:");
scanf("%d",&i);
if(i<=0||i>L.last)
printf("查询失败!\n\n");
else
printf("该位置的学生信息为\n学号:%s 姓名:%s 成绩:%d\n\n\n",
L.elem[i-1].no,L.elem[i-1].name,L.elem[i-1].price);
break;
case 5:
printf("请输入你要插入的位置:");
scanf("%d",&a);
printf("请输入插入学生信息:\n");
printf("学号:");
scanf("%s",m.no);
printf("姓名:");
scanf("%s",m.name);
printf("成绩:");
scanf("%d",&m.price);
if(InsList(&L,a,m))
{
sum++;
printf("插入成功!\n\n");
}
else
printf("插入失败!\n\n");
break;
case 6:
printf("请输入要删除学生的位置:");
scanf("%d",&c);
if(DelList(&L,c))
{
sum--;
printf("删除成功!\n\n");
}
else
printf("删除失败!\n\n");
break;
case 7:
{
printf("总学生个数为:%d\n\n",sum);
}
break;
case 8:
{
printf("\n退出系统成功!请按任意键结束!\n");
exit(0);
}
break;
}
}
return 0;
}