实验二:学生信息管理(单链表)
【实验目的】
1. 设计一个学生信息管理系统
2. 掌握用C语言定义单链表结构,并实现其创建、插入、删除等基本操作。
【实验内容】
本次实验通过单链表的基本操作,实现一个简单的学生信息管理系统,包括:学生信息链表的建立、添加学生信息、查询学生信息、删除学生信息、输出所有学生信息。
【实验要求】
本实验是对学生的信息管理作一个简单的模拟,用菜单选择操作方式完成下列功能:
1.学生信息链表的建立
2.插入学生信息
3.查询学生信息
4.删除学生信息
5.输出所有学生信息
0.退出管理系统
【知识要点】
本实验涉及单链表的各种操作,包括单链表的建立、结点的查找、插入、删除等基本运算。链表中插入结点的指针变化,删除p所指结点的指针变化。
【实现提示】
本题实质是建立学生信息线性表,每条信息由学号、姓名、性别与成绩组成,即链表中每个结点由5个域组成,分别为:学号、姓名、成绩、存放下一个结点地址的next域。要求完成的五项功能可写成五个函数(0项功能由菜单程序实现),登记学生成绩对应建立学生单链表的功能,2、3、4这三个功能分别对应单链表的插入、查询与删除三大基本操作。【代码】
#include
#include
#include
typedef struct{
char num[8];/*学号*/
char name[9];/*姓名*/
char gender[3];/*性别*/
int score;/*成绩*/
}DataType;
typedef struct node{
DataType data;
struct node *next;
}ListNode;
typedef ListNode *LinkList;
LinkList head;
/*函数说明*/
int menu_select();
LinkList createList(void);
void printList(LinkList head);
int insertNode(LinkList head,ListNode *p,int i);
ListNode *findList(LinkList head);
void delNode(LinkList head);
void main()
{
ListNode *p;
int i;
while(1){
switch(menu_select())
{
case 1:
printf("**************************************\n");
printf(" 学生信息链表的建立\n");
printf("***************************************\n");
head = createList();
break;
case 2:
printf("**************************************\n");
printf("添加学生信息\n");
printf("**************************************\n");
printf("\n学号(8)姓名(8)性别成绩\n");
printf("**************************************\n");
p=(ListNode *)malloc(sizeof(ListNode));
scanf("%s%s%s%d",p->data.num,p->https://www.wendangku.net/doc/10291036.html,,p->data.gender,&p->data.score);
printf("请输入要插入的位置:\n");
fflush(stdin);
scanf("%d",&i);
if(insertNode(head,p,i)==-1)
{
printf("没有合适的插入点!\n");
}
else
{
printf("结点已经插入\n");
}
break;
case 3:
printf("**************************************\n");
printf("查询学生信息\n");
printf("**************************************\n");
p=findList(head);
if(p!=NULL)
{
printf("\n学号(8)姓名(8)性别成绩\n");
printf("-------------------------------------------\n");
printf("%s,%s,%s,%d\n",p->data.num,p->https://www.wendangku.net/doc/10291036.html,,p->data.gender,p->data.score);
printf("------------------------------------------------------------------\n");
}
else
printf("没查到要查询的学生信息!");
break;
case 4:
printf("**************************************\n");
printf("删除学生信息\n");
printf("**************************************\n");
delNode(head);
break;
case 5:
printf("**************************************\n");
printf("输出所有学生信息\n");
printf("**************************************\n");
printList(head);
break;
case 0:
printf("再见!\n");
getchar();
return;
}
}
}
int menu_select()
{
int sn;
printf("\n 学生信息管理系统\n");
printf("=========================================\n");
printf(" 1.学生信息链表的建立\n");
printf(" 2.插入学生信息\n");
printf(" 3.查询学生信息\n");
printf(" 4.删除学生信息\n");
printf(" 5.输出所有学生信息\n");
printf(" 0.退出管理系统\n");
printf("==========================================\n");
printf("请选择0-5:\n");
for(;;)
{
scanf("%d",&sn);
if (sn<0 || sn>5)
printf("\n\t输入错误,重选0-5\n");
else
break;
}
return sn;
}
LinkList createList(void)
{
ListNode *p,*rear;
char flag = 'y';
head = (ListNode *)malloc(sizeof(ListNode));
rear = head;
while(flag=='y' || flag=='Y')
{
p=(ListNode *)malloc(sizeof(ListNode));
printf("\n学号(8)姓名(8)性别成绩\n");
scanf("%s%s%s%d",p->data.num,p->https://www.wendangku.net/doc/10291036.html,,p->data.gender,&p->data.score);
rear->next = p;
rear = p;
printf("继续输入吗?(y/n):");
flag = getchar();
}
rear->next = NULL;
return head;
}
void printList(LinkList head)
{
ListNode *p;
p=head->next;
printf("\n学号(8)姓名(8)性别成绩\n");
printf("-------------------------------------------\n");
while(p!=NULL)
{
printf("%s,%s,%s,%d\n",p->data.num,p->https://www.wendangku.net/doc/10291036.html,,p->data.gender,p->data.score);
printf("------------------------------------------------------------------\n");
p=p->next;
}
}
int insertNode(LinkList head,ListNode *p,int i)
{
ListNode *p1;
int j=1;
p1=head;
if(p1->next==NULL)/*空表:插入作为第一个结点*/
{
if(i==0)
{
p1->next=p;
p->next=NULL;
}
else
return -1;
}
while((j<=i-1)&&(p1!=NULL))/*找到第i-1个结点,p1指向该结点*/ {
p1=p1->next;
j++;
}
if(p1==NULL)/*没有合适的插入点*/
return -1;
p->next=p1->next;
p1->next=p;
return 0;
}
ListNode *findList(LinkList head)
{
ListNode *p;
char num[8];
char name[9];
int xz;
printf("===========================\n");
printf("1、按学号查询\n");
printf("2、按姓名查询\n");
printf("===========================\n");
printf(" 请选择:");
p=head->next;
scanf("%d",&xz);
if (xz==1)
{
printf("请输入要查找学生的学号:");
scanf("%s",num);
while(p && strcmp(p->data.num,num)!=0)
p=p->next;
}
else
if (xz==2)
{
printf("请输入要查找学生的姓名:");
scanf("%s",name);
while (p && strcmp(p->https://www.wendangku.net/doc/10291036.html,,name)!=0)
p=p->next;
}
return p;
}
void delNode(LinkList head)
{
ListNode *p,*q;
printf("请先查找您要删除的学生信息:\n");
p=findList(head);
if(p==NULL)
{
printf("没有查到要删除的学生信息");
return;
}
q=head;
while(q!=NULL && q->next!=p) q=q->next;
q->next=p->next;
free(p);
printf("该学生信息已被删除!\n");
}