目录
定义结构体存储学生信息(姓名 成绩):
功能实现,各种功能函数如下↓
菜单函数:
创建链表函数
判断是否为空的判空函数
插入函数(头插方式实现)
遍历链表函数
排序输出(升序)
输出最高分学生信息
以名字查找该学生的前驱节点
通过名字删除学生信息
按照名字查找学生信息并输出信息
按姓名修改学生信息
全部代码
linklist.h
linklist.c
main.c
定义结构体存储学生信息(姓名 成绩):
typedef char datatype;
typedef struct student
{
char name[20];
int score;
}stu;
typedef struct Node
{
union{
stu data;//数据域
int len;
};
struct Node *next;//指针域
}Linklist;
功能实现,各种功能函数如下↓
菜单函数:
//菜单
void menu()
{
printf("\t********学生信息管理系统********\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");
}
创建链表函数
//创建
Linklist *list_create()
{
Linklist *L=(Linklist*)malloc(sizeof(Linklist));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}//初始化
L->len =0;
L->next=NULL;
printf("创建成功\n");
return L;
}
判断是否为空的判空函数
//判空
int list_empty(Linklist *L)
{
return NULL==L->next ?1:0;//1表示空 0表示非空
}
插入函数(头插方式实现)
//头插
int list_insert_head(Linklist *L,char name[],int score)
{
//判断条件
if (NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
//申请节点
Linklist *p=(Linklist *)malloc(sizeof(Linklist));
if(NULL==p)
{
printf("节点申请失败\n");
return -1;
}
//插入数据
strcpy(p->data.name,name);
p->data.score=score;
p->next=NULL;
//完成头插
p->next = L->next;
L->next = p;
//表的变化
L->len++;
}
遍历链表函数
//遍历
void list_show(Linklist *L)
{
//判断逻辑
if (NULL==L || list_empty(L))
{
printf("表空 遍历失败\n");
}
//遍历逻辑
printf("\n\t学生信息为:\n\t**************\n\t姓名\t分数\n");
Linklist *q= L->next;
while (q!=NULL)
{
printf("\t%s",q->data.name);
printf("\t%d\t",q->data.score);
q=q->next;
printf("\n");
}
printf("\n");
}
排序输出(升序)
//排序输出
void sort(Linklist *L)
{
Linklist *t=(Linklist *)malloc(sizeof(Linklist));
t->next=NULL;
for(int i=1;i<L->len;i++)
{
Linklist *q=L->next;
Linklist *p=q->next;
for(int j=0;j<L->len-i;j++)
{
if (q->data.score>p->data.score)
{
t->data=q->data;q->data=p->data;p->data=t->data;
}
q=q->next;
p=p->next;
}
}
free(t);
t=NULL;
}
输出最高分学生信息
//查找分数最高学生信息
int max(Linklist *L)
{
Linklist *q=L->next;
Linklist *p=(Linklist*)malloc(sizeof(Linklist));
strcpy(p->data.name,"");
p->data.score=0;
p->next=NULL;
for(int i=1;i<=L->len;i++)
{
if(q->data.score>p->data.score)
{
p->data=q->data;
}q=q->next;
}printf("%s\t%d\n",p->data.name,p->data.score);
return 1;
}
以名字查找该学生的前驱节点
//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[])
{//判断逻辑
if (NULL==L )
{
printf("查找失败\n");
return NULL;
}
//查找节点
Linklist *q=L;
for (int i=1; i<=L->len; i++)
{
if ((strcmp(q->next->data.name,name))==0)
{
break;
}
q=q->next;
}
return q;//将找到的节点返回
}
通过名字删除学生信息
//按名字删
int list_delete_name(Linklist *L,char name[])
{
//判断逻辑
if (NULL==L|| list_empty(L))
{
printf("删除失败\n");
return -1;
}
//找到要删除位置的前驱
Linklist *q=find_node(L,name);
//删除逻辑
Linklist *p=q->next;
q->next=p->next;
//释放空间
free(p);
p=NULL;
//表的变化
L->len--;
}
按照名字查找学生信息并输出信息
//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name)
{
if (NULL==L || list_empty(L))
{
//printf("查找失败\n");
return -1;
}
//查找逻辑
Linklist *q=L->next;
for (int i=1; i<=L->len; i++)
{
if (strcmp(q->data.name,name)==0)
{
printf("\t%s\t%d\n",q->data.name,q->data.score);
return i;//返回学生位置
}
q=q->next;
}
return 0;
}
按姓名修改学生信息
//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score)
{
Linklist *p=L;
while(p->next!=NULL)
{
p=p->next;
if(strcmp(p->data.name,name)==0)
{
strcpy(p->data.name,new_name);
p->data.score=new_score;
printf("修改成功\n");
return 1;
}
}printf("未找到\n");
return -1;
}
全部代码
linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef char datatype;
typedef struct student
{
char name[20];
int score;
}stu;
typedef struct Node
{
union{
stu data;//数据域
int len;
};
struct Node *next;//指针域
}Linklist;
//菜单
void menu();
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *L);
//头插
int list_insert_head(Linklist *L,char name[],int score);
//遍历
void list_show(Linklist *L);
//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[]);
//按名字删
int list_delete_name(Linklist *L,char name[]);
//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name);
//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score);
//排序输出
void sort(Linklist *L);
//查找分数最高学生信息
int max(Linklist *L);
#endif
linklist.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
//菜单
void menu()
{
printf("\t********学生信息管理系统********\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");
}
//创建
Linklist *list_create()
{
Linklist *L=(Linklist*)malloc(sizeof(Linklist));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}//初始化
L->len =0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//判空
int list_empty(Linklist *L)
{
return NULL==L->next ?1:0;//1表示空 0表示非空
}
//头插
int list_insert_head(Linklist *L,char name[],int score)
{
//判断条件
if (NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
//申请节点
Linklist *p=(Linklist *)malloc(sizeof(Linklist));
if(NULL==p)
{
printf("节点申请失败\n");
return -1;
}
//插入数据
strcpy(p->data.name,name);
p->data.score=score;
p->next=NULL;
//完成头插
p->next = L->next;
L->next = p;
//表的变化
L->len++;
//rintf("头插成功\n");
}
//遍历
void list_show(Linklist *L)
{
//判断逻辑
if (NULL==L || list_empty(L))
{
printf("表空 遍历失败\n");
}
//遍历逻辑
printf("\n\t学生信息为:\n\t**************\n\t姓名\t分数\n");
Linklist *q= L->next;
while (q!=NULL)
{
printf("\t%s",q->data.name);
printf("\t%d\t",q->data.score);
q=q->next;
printf("\n");
}
printf("\n");
}
//排序输出
void sort(Linklist *L)
{
Linklist *q=L->next;
Linklist *p=q->next;
Linklist *t=(Linklist *)malloc(sizeof(Linklist));
t->next=NULL;
for(q;q!=NULL;q=q->next)
{
for(p;p!=NULL;p=p->next)
{
if (q->data.score>p->data.score)
{
t->data=q->data;q->data=p->data;p->data=t->data;
break;
}
}
}
free(t);
t=NULL;
}
//查找分数最高学生信息
int max(Linklist *L)
{
Linklist *q=L->next;
Linklist *p=(Linklist*)malloc(sizeof(Linklist));
strcpy(p->data.name,"");
p->data.score=0;
p->next=NULL;
for(int i=1;i<=L->len;i++)
{
if(q->data.score>p->data.score)
{
p->data=q->data;
}q=q->next;
}printf("%s\t%d\n",p->data.name,p->data.score);
return 1;
}
//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[])
{//判断逻辑
if (NULL==L )
{
printf("查找失败\n");
return NULL;
}
//查找节点
Linklist *q=L;
for (int i=1; i<=L->len; i++)
{
if ((strcmp(q->next->data.name,name))==0)
{
break;
}
q=q->next;
}
return q;//将找到的节点返回
}
//按名字删
int list_delete_name(Linklist *L,char name[])
{
//判断逻辑
if (NULL==L|| list_empty(L))
{
printf("删除失败\n");
return -1;
}
//找到要删除位置的前驱
Linklist *q=find_node(L,name);
//删除逻辑
Linklist *p=q->next;
q->next=p->next;
//释放空间
free(p);
p=NULL;
//表的变化
L->len--;
}
//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name)
{
if (NULL==L || list_empty(L))
{
//printf("查找失败\n");
return -1;
}
//查找逻辑
Linklist *q=L->next;
for (int i=1; i<=L->len; i++)
{
if (strcmp(q->data.name,name)==0)
{
printf("\t%s\t%d\n",q->data.name,q->data.score);
return i;//返回学生位置
}
q=q->next;
}
return 0;
}
//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score)
{
Linklist *p=L;
while(p->next!=NULL)
{
p=p->next;
if(strcmp(p->data.name,name)==0)
{
strcpy(p->data.name,new_name);
p->data.score=new_score;
printf("修改成功\n");
return 1;
}
}printf("未找到\n");
return -1;
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include"linklist.h"
int main(int argc, const char *argv[])
{
Linklist *L=list_create();
if (NULL==L)
{
return -1;
}
menu();
int num,n,score;//功能编号和学生个数 分数
char name[20];
for (;;)
{
printf("请选择功能:");
scanf("%d",&num); //功能编号
switch(num)
{
case 1:
{
printf("请输入需要输入的学生个数:");
scanf("%d",&n);
for (int i=0; i<n; i++)
{
printf("请输入学生姓名:");
scanf("%s",name);
printf("请输入学生的分数:");
scanf("%d",&score);
list_insert_head(L,name,score);
}
list_show(L);
}break;
case 2:
{
list_show(L);
}break;
case 3:
{
printf("请输入要删除的学生姓名:");
scanf("%s",name);
list_delete_name(L,name);
list_show(L);
}break;
case 4:
{
char new_name[20];int new_score; //定义新的学生姓名和分数
printf("请输入需要修改信息的学生姓名:");
scanf("%s",name);
printf("请输入新的学生姓名:");
scanf("%s",new_name);
printf("请输入新的学生分数:");
scanf("%d",&new_score);
list_update_value(L,name,new_name,new_score);
list_show(L);
}break;
case 5:
{
sort(L);
list_show(L);
}break;
case 6:
{
max(L);
}break;
case 7:
{
printf("请输入需要查找信息的学生姓名:");
scanf("%s",name);
list_search_value(L,name);
}break;
case 8:
{
exit(0);
}break;
default:printf("输入不合法\n");
}
}
return 0;
}
这就是一个简单学生管理系统仅供大家参考,欢迎大家修改完善使用