前言
在前面我们已经实现了链表的创建、查找、删除、插入,下面我们使用这些内容实现一个学生管理系统
大概功能如下
只实现了管理学生的学号、性别、数学成绩和语文成绩。
之所以没有姓名,纯属是为了好测试代码
全部代码如下
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//学生信息封装成结构体
typedef struct students{
int ID;
int sex;
int Math_Scorce;
int Chinese_Scorce;
}Node_Data;
typedef struct node{
Node_Data data;
struct node* next;
}Lnode;
//创建链表头节点,返回值为struct node*
Lnode* Create_Head_Node()
{
//动态内存申请
Lnode* Head_Node = (Lnode *)malloc(sizeof(Lnode));
if(Head_Node == NULL)
return NULL;
else
{
//初始化头节点
// Head_Node->data = 1; //这个可以随意赋值
Head_Node->next = NULL;
return Head_Node;
}
}
//创建新的节点,并给此节点赋值
Lnode* Create_New_Node(Node_Data temp)
{
Lnode* New_Node = (Lnode *)malloc(sizeof(Lnode));
if(New_Node == NULL)
return NULL;
else
{
New_Node->data.ID = temp.ID;
New_Node->data.sex = temp.sex;
New_Node->data.Math_Scorce = temp.Math_Scorce;
New_Node->data.Chinese_Scorce = temp.Chinese_Scorce;
New_Node->next = NULL;
return New_Node;
}
}
//打印链表
void Printf_List(Lnode* Head_Node)
{
Lnode* pMove = Head_Node->next;
if(pMove == NULL)
{
// printf("打印失败\n");
return ;
}
else
{
while(pMove != NULL)
{
if(pMove->data.sex == 0)
printf("%d\t女\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
else
printf("%d\t男\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
pMove = pMove->next;
}
printf("\n");
}
}
//头插法插入数据
void Insert_Data_List(Lnode* Head_Node,Node_Data temp)
{
Lnode* New_Node = Create_New_Node(temp);
if(New_Node == NULL)
{
printf("插入失败\n");
return ;
}
else
{
New_Node->next = Head_Node->next;
Head_Node->next = New_Node;
//printf("插入成功\n");
return ;
}
}
//按值删除
void Delete_AccordValue_List(Lnode* Head_Node,Node_Data posdata)
{
Lnode* posNode = Head_Node->next;
Lnode* posNodeFornt = Head_Node;
if(posNode == NULL)
{
printf("此链表为空,删除失败\n");
return ;
}
else
{
while(posNode->data.ID != posdata.ID)
{
posNodeFornt = posNode;
posNode = posNode->next;
if(posNode == NULL)
{
printf("删除失败,不存在该值\n");
return ;
}
}
posNodeFornt->next = posNode->next;
free(posNode);
printf("删除成功\n");
}
}
//后继插入
void Inster_PostionRear_List(Lnode* Head_Node,Node_Data posdata,Node_Data data)
{
Lnode* posNode = Head_Node->next;
Lnode* New_Node = Create_New_Node(data);
if(posNode == NULL)
{
printf("插入失败\n");
return ;
}
else
{
while(posNode->data.ID != posdata.ID)
{
posNode = posNode->next;
if(posNode == NULL)
{
printf("插入失败\n");
return ;
}
}
New_Node->next = posNode->next;
posNode->next = New_Node;
printf("插入成功!!!!\n");
}
}
//查找链表中的某个值
void Find_CertainValue_List(Lnode* Head_Node,Node_Data value)
{
Lnode* pMove = Head_Node->next;
if(pMove == NULL)
{
printf("查找失败,链表为空\n");
return ;
}
else
{
while(pMove->data.ID != value.ID)
{
pMove = pMove->next;
if(pMove == NULL)
{
printf("查找失败,没有该学生\n");
return ;
}
}
printf("学号\t性别\t数学\t语文\n");
if(pMove->data.sex == 0)
printf("%d\t女\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
else
printf("%d\t男\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
printf("查找成功\n");
return ;
}
}
//以学号来进行排序
void Rank_ID_List(Lnode* Head_Node)
{
Lnode *p,*q,*tail;
tail = NULL;
if(Head_Node->next == NULL)
{
printf("插入错误!!!\n");
return ;
}
else
{
while((Head_Node->next->next) != tail)
{
p = Head_Node;
q = Head_Node->next;
while(q->next != tail)
{
if((q->data.ID) > (q->next->data.ID))
{
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = p->next;
}
q = q->next;
p = p->next;
}
tail = q;
}
}
}
//以数学成绩来进行排序
void Rank_Math_Scorce_List(Lnode* Head_Node)
{
Lnode *p,*q,*tail;
tail = NULL;
if(Head_Node->next == NULL)
{
printf("插入错误!!!\n");
return ;
}
else
{
while((Head_Node->next->next) != tail)
{
p = Head_Node;
q = Head_Node->next;
while(q->next != tail)
{
if((q->data.Math_Scorce) > (q->next->data.Math_Scorce))
{
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = p->next;
}
q = q->next;
p = p->next;
}
tail = q;
}
}
}
void Menu()
{
printf("\n\t**************************************\n");
printf("\t* 欢迎使用学生管理系统 *\n");
printf("\t*\t0:输入学生信息 *\n");
printf("\t*\t1:打印学生信息 *\n");
printf("\t*\t2:按学号查询学生信息 *\n");
printf("\t*\t3:按学号来插入学生信息 *\n");
printf("\t*\t4:删除学生信息 *\n");
printf("\t*\t5:以学号进行降序排序 *\n");
printf("\t*\t6:以数学成绩进行降序排序 *\n");
printf("\t*\t7:显示菜单 *\n");
printf("\t*\t8:清屏 *\n");
printf("\t*\t9:退出系统 *\n");
printf("\t* 说明:输入性别时,1:男 0:女 *\n");
printf("\t**************************************\n");
}
int main()
{
int select;
char key;
Lnode* Head_Node = Create_Head_Node();
Node_Data temp,inster_temp;
Menu();
printf("请输入你的选择:");
while(1)
{
scanf("%d",&select);
switch(select)
{
case 0: printf("请输入学生的学号、性别、数学、语文:");scanf("%d%d%d%d",&temp.ID,&temp.sex,&temp.Math_Scorce,&temp.Chinese_Scorce); Insert_Data_List(Head_Node,temp);break;
case 1: printf("学号\t性别\t数学\t语文\n"); Printf_List(Head_Node); break;
case 2: printf("请输入查询学生的学号:");scanf("%d",&temp.ID);Find_CertainValue_List(Head_Node,temp); break;
case 3: printf("请输入插入在哪个学生后面:");scanf("%d",&temp.ID);printf("\n请输入学生的学号、性别、数学、语文:");scanf("%d%d%d%d",&temp.ID,&temp.sex,&temp.Math_Scorce,&temp.Chinese_Scorce);Inster_PostionRear_List(Head_Node,temp,inster_temp); break;
case 4: printf("请输入待删除学生的学号:");scanf("%d",&temp.ID);Delete_AccordValue_List(Head_Node,temp);break;
case 5: Rank_ID_List(Head_Node); break;
case 6: Rank_Math_Scorce_List(Head_Node); break;
case 7: Menu();break;
case 8: system("clear");break;
case 9: printf("你已退出学生管理系统!!!!\n"); return 0; break;
default: printf("输入错误\n");break;
}
printf("\n是否继续(y/n):");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key == 'N' || key == 'n')
break;
printf("请输入你的选择:");
}
printf("你已退出学生管理系统!!!!\n");
return 0;
}
有错误的地方请指出来,我们一起进步