用单链表实现学生信息管理系统
问题描述
定义一个包含学生信息(学号,姓名,成绩)的的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
话不多说,直接上代码!
#include "stdio.h"
#include "stdlib.h" //malloc
#include "string.h"
//学生信息的定义:
typedef struct {
char no[8]; //8位学号
char name[20]; //姓名
int score; //成绩
}Student;
//链表结点的定义:
typedef struct LNode{
Student data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//输入学生信息
void in(LNode *head)
{
LinkList p,r; //p指向新结点; r指向当前链表的尾结点
int i,n; //n表示学生的人数
r=head;
printf("请输入学生的人数:");
scanf("%d",&n);
printf("请输入学生的信息:\n");
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
printf("学号:");
scanf("%s",p->data.no);
printf("姓名:");
scanf("%s",p->data.name);
printf("成绩:");
scanf("%d",&p->data.score);
r->next=p;
r=r->next;
printf("-----------------------------------------\n");
}
printf("********************************************************\n");
}
//输出学生信息
void out(LNode *head)
{
LinkList p;
p=head;
printf("请输出学生的信息:\n\n");
printf("学号\t姓名\t成绩\n");
while(p->next!=NULL)
{
p=p->next;
printf("%s\t%s\t%d\n",p->data.no,p->data.name,p->data.score);
}
}
void research_1(LNode *head,Student e)
{
LinkList p;
p=head;
printf("请输入查找的姓名:\n");
scanf("%s",e.name);
while((p->next!=NULL)&&strcmp(e.name,p->data.name))
{
p=p->next;
}
printf("学号 %s\t 成绩 %d\n",p->data.no,p->data.score);
}
void research_2(LNode *head,int i)
{
int k;
LinkList p;
printf("请输入你要查询的位置:");
scanf("%d",&i);
if(i<0)
{
printf("查找失败!\n");
}
p=head;k=0;
while(p->next!=NULL&&k<i)
{
p=p->next;
k=k+1;
}
if(i==k)
printf("学号:%s\t 姓名: %s\t成绩: %d\n",p->data.no,p->data.name,p->data.score);
else
printf("查找失败!\n");
}
void insert(LNode *head,int i,Student e)
{
int k;
LinkList p,r;
r=head;k=0;
printf("请输入你要插入的位置:\n");
scanf("%d",&i);
printf("请输入插入学生的信息:\n");
printf("学号:\n");
scanf("%s",e.no);
printf("姓名:\n");
scanf("%s",e.name);
printf("成绩:\n");
scanf("%d",&e.score);
while(r!=NULL&&k<i-1)
{
r=r->next;
k=k+1;
}
if(r==NULL)
{
printf("插入失败!\n");
}
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=r->next;
r->next=p;
printf("插入成功!\n");
}
void delete_1(LNode *head,int i,Student *e)
{
LinkList p,r;
int k;
r=head;k=0;
printf("请输入你要删除的位置:\n");
scanf("%d",&i);
while(r->next!=NULL&&k<i-1)
{
r=r->next;
k++;
}
if(r==NULL)
{
printf("删除失败!\n");
}
p=r->next;
r->next=p->next;
*e=p->data;
free(p);
printf("删除成功!\n");
}
void number(LNode *head)
{
int i;
LinkList p;
p=head->next;i=0;
while(p!=NULL)
{
p=p->next;
i++;
}
printf("学生总数为:%d\n",i);
printf("\n");
}
void exit_1()
{
printf("退出成功!请按任意键结束!");
exit(0);
}
int main()
{
LNode *head;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
int select=-1;
int i;
Student 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!=0)
{
printf("请选择你要操作的选项:");
scanf("%d",&select);
printf("\n");
switch(select)
{
case 1: in(head); break;
case 2: out(head); break;
case 3: research_1(head,e);break;
case 4: research_2(head,i);break;
case 5: insert(head,i,e);break;
case 6: delete_1(head,i,&e);break;
case 7: number(head);break;
case 8: exit_1();break;
}
}
return 0;
}