数据结构线性表实现学生信息管理系统
方法一:顺序表实现
#include
#include
#include
#include
#define MAXSIZE 1000
#define OVERFLOW -1
using namespace std;
typedef struct{
char num[8];
char name[20];
int score;
}Student;
typedef struct{
Student *elem;
int length;
}SqList;
SqList L;
int InitList(SqList &L){
L.elem=new Student[MAXSIZE];
if (!L.elem) exit(OVERFLOW);
L.length=0;
return 1;
}
int GetElem(SqList L,int i,Student &s){
if(i<1||i>L.length){
return 0;
}else{
s=L.elem[i-1];
return 1;
}
}
int LocateElem(SqList L,Student &s){
for(int i=0;i<L.length;i++){
if(!strcmp(L.elem[i].name,s.name))
{
s = L.elem[i];
return 1;
}
}
return 0;
}
int ListInsert(SqList &L,int i,Student &s){
if((i<1)||(i>L.length+1))
return 0;
if(L.length==MAXSIZE)
return 0;
for(int j=L.length-1;j>=i-1;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=s;
++L.length;
return 1;
}
int ListDelete(SqList &L,int i){
if((i<1)||(i>L.length))
return 0;
for(int j=i;j<=L.length-1;j++){
L.elem[j-1]=L.elem[j];
}
--L.length;
return 1;
}
void InputList(SqList &L,int i,Student e)
{
L.length+=1;
L.elem[i]=e;
}
int main(){
Student student;
InitList(L);
int a;
while(1) {
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("请输入您的选择:");
scanf("%d",&a);
printf("--------------------------------------------------------");
printf("\n");
switch(a)
{
case 1:
{
for(int i=0;i<5;i++)
{
printf("学号:");
scanf("%s",&student.num);
printf("姓名:");
scanf("%s",&student.name);
printf("成绩:");
scanf("%d",&student.score);
InputList(L,i,student);
printf("\n");
}
printf("输入学生信息成功,请选择接下来的操作…………");
printf("\n\n\n\n\n\n");
break;
}
case 2://显示全部学生的信息;
{
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=L.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
}
printf("\n\n\n\n\n\n");
break;
}
case 3://根据学生姓名查找学生信息
{
int i;
printf("请输入您要查找学生的名字:");
scanf("%s",&student.name);
i=LocateElem(L,student);
if(!i)
{
printf("系统中无记录\n");
}
printf("学号:%s\t\t姓名:%s\t\t成绩:%3d\n",student.num,student.name,student.score);
printf("\n\n\n\n\n\n");
break;
}
case 4://根据位置查找学生信息
{
int local;
printf("请输入要查询的位置:");
scanf("%d",&local);
GetElem(L,local,student);
printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
printf("\n\n\n\n\n\n");
break;
}
case 5://给定一个学生信息,插入到表中指定位置;
{
int t,i;
printf("请输入学生的学号:");
scanf("%s",&student.num);
printf("请输入学生的姓名:");
scanf("%s",&student.name);
printf("请输入学生的成绩:");
scanf("%d",&student.score);
printf("请输入插入的位置:");
scanf("%d",&t);
i = ListInsert(L,t,student);
if(i)
{
printf("添加成功…………");
printf("\n") ;
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=L.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
}
}
else
printf("插入失败,请选择正确的插入位置…………");
printf("\n\n\n\n\n\n");
break;
}
case 6://删除指定位置的学生信息;
{
int i;
printf("请输入要删除的位置:");
scanf("%d",&i);
ListDelete(L,i);
printf("删除成功…………");
printf("\n");
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=L.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
}
printf("\n\n\n\n\n\n");
break;
}
case 7://统计系统中学生个数
{
printf("系统中学生个数:%d\n",L.length);
printf("\n\n\n\n\n\n");
break;
}
case 8://退出系统;
{
return 0;
}
default:
{
printf("输入错误,请重新输入");
printf("\n\n\n\n\n\n");
}
}
}
}
方法二:链表实现
#include
#include
#include
#include
#define MAXSIZE 1000
using namespace std;
typedef struct{
char num[8];
char name[20];
int score;
}Student;
Student student;
typedef struct LNode
{
Student data;
struct LNode *next;
}LNode,*LinkList;
typedef struct{
int length;
}T;
T list;
LinkList L;
LNode *p,*s,*q,*head;
int InitList(LinkList &L)
{
L = new LNode;
L->next=NULL;
list.length=0;
return 1;
}
int GetElem(LinkList L,int i,Student &e)
{
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return 0;
e=p->data;
return 1;
}
int LocateElem(LinkList L,Student &e)
{
int j=0;
p=L->next;
while(p && strcmp((p->data).name,e.name))
{
p=p->next;
++j;
}
if(!p||j>list.length)
return 0;
e=p->data;
return 1;
}
int ListInsert(LinkList $L,int i,Student &e)
{
p=L;int j=0;
while(p && (j<i-1))
{
p=p->next;++j;
}
if(!p||j>i-1) return 0;
s = new LNode;
s->data=e;
s->next=p->next;
p->next=s;
list.length++;
return 1;
}
int ListDelete(LinkList &L,int i)
{
p=L;int j=0;
while((p->next) && (j<i-1))
{p=p->next;++j;}
if(!(p->next)||(j>i-1)) return 0;
q=p->next;
p->next=q->next;
delete q;
list.length--;
return 1;
}
void CreateList_H(LinkList &L,int n)
{
L->next=NULL;
Student stu;
LNode *r;
r=L;
for(int i=0;i<n;++i)
{
p=new LNode;
printf("学号:");
scanf("%s",&student.num);
printf("姓名:");
scanf("%s",&student.name);
printf("成绩:");
scanf("%d",&student.score);
list.length++;
printf("\n\n");
p->data=student;
p->next=NULL;
r->next=p;
r=p;
}
}
int main()
{
Student student;
InitList(L);
int a;
while(1) {
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("请输入您的选择:");
scanf("%d",&a);
printf("--------------------------------------------------------");
printf("\n");
switch(a)
{
case 1:
{
CreateList_H(L,5);
printf("输入学生信息成功,请选择接下来的操作…………");
printf("\n\n\n\n\n\n");
break;
}
case 2://显示全部学生的信息;
{
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=list.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%d\t\n",student.num,student.name,student.score);
}
printf("\n\n\n\n\n\n");
break;
}
case 3://根据学生姓名查找学生信息
{
int i;
printf("请输入您要查找学生的名字:");
scanf("%s",&student.name);
i=LocateElem(L,student);
if(!i)
printf("系统中没有此学生\n");
printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
printf("\n\n\n\n\n\n");
break;
}
case 4://根据位置查找学生信息
{
int i;
int local;
printf("请输入要查询的位置:");
scanf("%d",&local);
GetElem(L,local,student);
printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
printf("\n\n\n\n\n\n");
break;
}
case 5://给定一个学生信息,插入到表中指定位置;
{
int t,i;
printf("学号:");
scanf("%s",&student.num);
printf("姓名:");
scanf("%s",&student.name);
printf("成绩:");
scanf("%d",&student.score);
printf("插入位置:");
scanf("%d",&t);
ListInsert(L,t,student);
if(1)
{
printf("添加成功…………");
printf("\n") ;
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=list.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
}
}
else
printf("插入失败,请选择正确的插入位置…………");
printf("\n\n\n\n\n\n");
break;
}
case 6://删除指定位置的学生信息;
{
int i;
printf("请输入要删除的位置:");
scanf("%d",&i);
ListDelete(L,i);
printf("删除成功…………");
printf("\n");
printf("NO\t\tName\t\t\tScore\t\n");
for(int i=1;i<=list.length;i++)
{
GetElem(L,i,student);
printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
}
printf("\n\n\n\n\n\n");
break;
}
case 7://统计系统中学生个数
{
printf("系统中学生个数:%d\n",list.length);
printf("\n\n\n\n\n\n");
break;
}
case 8://退出系统;
{
return 0;
}
default:
{
printf("输入错误,请重新输入");
printf("\n\n\n\n\n\n");
}
}
}
}