代码拉取完成,页面将自动刷新
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student{
/* 数据域 */
unsigned int id;
char name[20];
float score;
/* 指针域 */
struct student *pnext;
}STD;
STD *Creat_node(void);
STD *Creat_Linked(int num);
void Link_Insert(STD *phead,STD *pnew);
STD *Link_Search(STD *phead,unsigned int ID_node);
int Link_Change(STD *phead,STD std);
int Link_Dele(STD *phead, int id);
STD *Link_Sort(STD *phead);
//void Link_Sort(STD *phead);
void menu(void);
void Add_Information(STD *phead);
void Dele_Information(STD *phead);
void Change_Information(STD *phead);
void Look_Information(STD *phead);
/********************************************************************************************************************
函数名:Creat_node
函数功能:创建节点
形式参数:无
返回值:
(STD)struct student*:返回创建节点地址
NULL:节点创建失败
*********************************************************************************************************************/
STD *Creat_node(void)
{
STD *p = (STD *)malloc(sizeof(STD));//p接受开辟的地址
p->pnext = NULL;//节点的指针域指向NULL
/* if(p = NULL)
{
printf("节点创建失败\n");
}
*/
return p;
}
/************************************************************************************************************************
函数名:Creat_Linked
函数功能:创建多个空链表
形式参数:
int num :创建链表节点个数
返回值:
(STD)struct student*:返回新链表地址
NULL:创建链表失败
*************************************************************************************************************************/
STD *Creat_Linked(int num)
{
STD *hear = NULL;
hear = (STD *)calloc(num,sizeof(STD));
STD *strand = hear;
/*
if(hear==NULL)
{
printf("链表创建失败\n");
}
*/
for(int i = 0;i < num - 1;i++)
{
strand->pnext = strand+1;
}
strand->pnext = NULL;
return hear;
}
/*
1 2 3 4 5
1->2
2->3
3->4
4->5
5->NULL
*/
/***************************************************************************************************************************
函数名:Link_Insert
函数功能:链表节点插入函数
具体功能:STD *pnew插入到STD *phead的后面
形式参数:
STD *phead:插入位置
STD *pnew:插入的节点地址
返回值:无
****************************************************************************************************************************/
void Link_Insert(STD *phead,STD *pnew)
{
if(phead->pnext != NULL)
{
pnew->pnext = phead->pnext;
}
phead->pnext = pnew;
}
/******************************************************************************************************************************
函数名:Link_Search
函数功能:链表查找ID节点地址
形式参数:
STD *phead:链表地址
unsigned int ID_node:ID值
返回值:
(STD)struct student*:返回查找ID节点地址
NULL:未查询到该ID
********************************************************************************************************************************/
STD *Link_Search(STD *phead,unsigned int ID_node)
{
STD *link = phead;//link接收链表地址
while(link != NULL)
{
if(link->id == ID_node)
{
return link;
}
link = link->pnext;
}
return NULL;
}
/******************************************************************************************************************************
函数名:Link_Change
函数功能:修改规定节点内容
形式参数:
STD *phead:链表地址
STD std:修改节点地址(出口参数)
返回值:
int :0修改失败 1修改成功
********************************************************************************************************************************/
int Link_Change(STD *phead,STD std)//修改
{
STD *hear = phead;//接收链表的头
STD *ID = Link_Search(hear,std.id);//接收查找(修改地址)的ID值的返回值
if(ID == NULL)
{
return 0;//修改失败,节点std不在phead链表中
}
/*******************************修改节点内容***********************************************/
ID->id = std.id;
strcpy(ID->name,std.name);
ID->score = std.score;
}
/******************************************************************************************************************************
函数名:Link_Dele
函数功能:删除节点
形式参数:
STD *phead:链表地址
int id:删除节点的ID值
返回值:
int :0修改失败 1修改成功
********************************************************************************************************************************/
int Link_Dele(STD *phead, int id)//删除
{
STD *hear = phead;//接收链表的头
STD *ID = Link_Search(hear,id);//接收查找删除ID值的返回值
if(ID == NULL||phead == NULL)
{
return 0;//删除的ID不存在或链表为空
}
while(hear!=NULL)
{
if(hear->pnext == ID)
{
hear->pnext = ID->pnext;
free(ID);
return 1;
}
hear = hear->pnext;
}
}
/******************************************************************************************************************************
函数名:Link_Sort
函数功能:链表排序
形式参数:
STD *phead:链表地址
返回值:
STD *:把排序后的链表通过返回值传出
********************************************************************************************************************************/
STD* Link_Sort(STD *phead)
{
STD *p = NULL;//炮灰
STD *head = NULL;//创建新链表
STD *sort = NULL;//最小地址前面的地址
STD *min = NULL;//假设最小
STD *sort_min = NULL;//储存上次的最小值地址
while(phead->pnext != NULL)
{
/***************比较找最小值地址********************/
min = phead->pnext;//假设第一节点最小
sort = phead;
for(p = min;p->pnext != NULL;p = p->pnext)
{
if(min->id > p->pnext->id)
{
min = p->pnext;
sort = p;
}
}
/***************原链表断开最小值的联系***************/
sort->pnext = min->pnext;
/******************创建新链表****************************/
min->pnext = NULL;//表尾指向NULL
if(head == NULL)//新链表第一次增添节点
{
head = min;
}
else
{
sort_min->pnext = min;
}
sort_min = min;//保存上一个节点地址
}
/******************把创建的新链表接在原链表的表头上**************************/
phead->pnext = head;//通过形参改变实参
return phead;//把排序后的链表通过返回值传出
}
/*******************学生信息管理系统主页面函数*************************/
void menu(void)
{
printf("********学生信息管理系统********\n");
printf(" 1. 添加信息 \n");
printf(" 2. 删除信息 \n");
printf(" 3. 修改信息 \n");
printf(" 4. 查询信息 \n");
printf(" 0. 退出系统 \n");
printf("********************************\n");
printf(" 请输入你要想执行的操作(0-4):");
}
/******************************************************************************************************************************
函数名:Add_Information
函数功能:给链表添加新的节点并给节点里的变量赋值
形式参数:
STD *phead:链表地址
返回值:
无
********************************************************************************************************************************/
void Add_Information(STD *phead)
{
STD *hear = phead;//接收链表地址
STD *add;//add接收新节点地址
int m;//输入添加的ID
while(hear!=NULL)
{
if(hear->pnext == NULL)
{
printf("请输入添加的ID:");
scanf("%d",&m);
if((STD*)Link_Search(phead,m) == NULL)
{
add = (STD *)malloc(sizeof(STD));//创建新的节点
hear->pnext = add;
add->id = m;
printf("请输入姓名:");
scanf("%s",add->name);
printf("请输入成绩:");
scanf("%f",&(add->score));
}
else
{
printf("该学生已存在,添加失败\n");
}break;
}
hear = hear->pnext;
}
}
void Dele_Information(STD *phead)
{
STD *hear = phead;//接收链表地址
int dele = 0;//接收删除节点函数返回值
int m = 0;//键盘输入ID值
printf("请输入你要删除的ID:");
scanf("%d",&m);
dele = Link_Dele(hear,m);//返回值
if(dele == 0)
{
printf("该学生不存在,删除失败\n");
}
phead = hear;
}
void Change_Information(STD *phead)
{
STD std = {0};
STD *p = NULL;//接收修改的ID地址
int m;
printf("请输入您要修改的ID:");
scanf("%d",&m);
std.id = m;
p = Link_Search(phead,std.id);
if(p == NULL)
{
printf("该学生不存在,修改失败\n");
}
else
{
strcpy(std.name,p->name);//ID内的内容赋值给std
std.score = p->score;
printf("1.修改姓名\n");
printf("2.修改成绩\n");
printf("3.修改全部\n");
printf("0.退出修改\n");
printf("请输入你要想执行的操作(0-3):");
scanf("%d",&m);
switch(m)
{
case 1:
printf("请输入姓名:");
scanf("%s",std.name);
Link_Change(phead,std);
break;
case 2:
printf("请输入成绩:");
scanf("%f",&std.score);
Link_Change(phead,std);
break;
case 3:
printf("请输入姓名,成绩:");
scanf("%s %f",std.name,&std.score);
Link_Change(phead,std);
break;
case 0:break;
default:printf("无法识别你输入的操作!\n");break;
}
}
}
void Look_Information(STD *phead)
{
Link_Sort(phead);
STD *hear = phead;
int m;
printf("1.查看全部学生\n");
printf("2.选择查看学生\n");
printf("0.退出查看\n");
printf("请输入你要想执行的操作(0-2):");
scanf("%d",&m);
switch(m)
{
case 1:
while(hear != NULL)
{
if(hear->id == 0)
{
printf("*********************学生信息*********************\n");
}
else
{
printf("学号:%d 姓名:%s 成绩:%.2f\n",hear->id,hear->name,hear->score);
}
hear = hear->pnext;
}
break;
case 2:
printf("请输入您要查看的ID:");
scanf("%d",&m);
hear = Link_Search(phead,m);
if(hear == NULL)
{
printf("该学号不存在,查看失败\n");
}
else
{
printf("*********************学生信息*********************\n");
printf("学号:%d 姓名:%s 成绩:%.2f\n",hear->id,hear->name,hear->score);
}break;
case 0:break;
default:printf("无法识别你输入的操作!\n");break;
}
}
int main()
{
STD *hear = NULL;//创建链表的头,接受链表地址
hear = Creat_node();//创建链表
int m = 0;//键盘输入
while(1)
{
menu();
scanf("%d",&m);
switch(m)
{
case 1:Add_Information(hear);break;
case 2:Dele_Information(hear);break;
case 3:Change_Information(hear);break;
case 4:Look_Information(hear);break;
case 0:return 0;//退出系统
default:printf("无法识别你输入的操作!\n");break;
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。