目录
总体评述:
使用单链表实现了7个功能,包括:
1、输入学生姓名和成绩
2、找出成绩最高的学生
3、成绩降序排序
4、增加学生信息
5、查找学生是否在班级
6、删除学生信息
7、修改学生信息
8、遍历学生信息
0、退出程序

1、输入学生姓名和成绩
//输入信息
int stu_input(Linklist *L)
{
printf("请输入学生个数:");
int num;
scanf("%d",&num);
datatype e;
for(int i=0;i<num;i++)
{
printf("第%d个学生:id:\t name:\t score:\t\n",i+1);
scanf("%d%s%d",&e.id,e.name,&e.score);
Linklist *p=node_buy(e);
list_insert_tail(L,e);
}
return 0;
}
2、找出成绩最高的学生
//求最高成绩
int stu_max(Linklist *L)
{
if(NULL == L || list_empty(L))
{
printf("查找失败!");
return -1;
}
Linklist *p=L->next;
Linklist *q=L->next;
int max;
for(int i=1;i<L->len;i++)
{
if(max<p->data.score)
{
max=p->data.score;
}
p=p->next;
}
for(int j=1;j<L->len;j++)
{
if(max == q->data.score)
{
printf("id:%d\t 姓名:%s\t 成绩:%d\t ",q->data.id,q->data.name,q->data.score);
}q=q->next;
}printf("找到成绩最高者!\n");
return 0;
}
3、成绩降序排序
//成绩降序排序
int stu_j(Linklist *L)
{
if(NULL == L || list_empty(L) || L->len<2)
{
printf("排序失败\n");
return -1;
}
Linklist *p=L->next;
datatype temp;
for(int i=1;i<L->len;i++)
{
for(int j=0;j<L->len-i;j++)
{
if(p->data.score<p->next->data.score)
{
temp.id=p->data.id;
p->data.id=p->next->data.id;
p->next->data.id=temp.id;
strcpy(temp.name,p->data.name);
strcpy(p->next->data.name,p->data.name);
strcpy(p->next->data.name,temp.name);
temp.score=p->data.score;
p->data.score=p->next->data.score;
p->next->data.score=temp.score;
}
}
}printf("降序排序成功!\n");
return 0;
}
4、增加学生信息
//插入一条信息
int stu_insert(Linklist *L)
{
int pos;
printf("输出需要插入的位置:");
scanf("%d",&pos);
if(NULL ==L || pos<0 || pos>L->len)
{
printf("查找失败\n");
return -1;
}
datatype e;
printf("id:\t name:\t score:\t\n");
scanf("%d%s%d",&e.id,e.name,&e.score);
Linklist *p=node_buy(e);
//查找要插入的位置的前驱节点
Linklist *q=find_node(L,pos-1);
p->next=q->next;
q->next =p;
L->len++;
printf("插入成功\n");
return 0;
}
5、查找学生是否在班级
//查找
int stu_search(Linklist *L)
{
if(NULL == L || list_empty(L))
{
printf("查找失败\n");
return -1;
}
printf("输入要查的名字:");
char e[20];
scanf("%s",e);
getchar();
Linklist *q=L->next;
int flag=0;
for(int i=1;i<=L->len;i++)
{
if(strcmp(q->data.name,e)==0)
{
printf("该同学在班级!");
printf("id:%d\t 姓名:%s\t 成绩:%d\t ",q->data.id,q->data.name,q->data.score);
flag=1;
}
q=q->next;
}
if(flag ==0)
{
printf("该同学不在这个班级里!");
}
printf("\n");
return 0;
}
6、删除学生信息
//删除指定名字的学生信息
int stu_delete(Linklist *L)
{
if(NULL == L || list_empty(L))
{
printf("删除失败\n");
return -1;
}
printf("输入要删除的名字:");
char e[20];
scanf("%s",e);
getchar();
Linklist *q=L;
int flag=0;
int n,id1,score1;
char name1[20];
for(int i=0;i<L->len;i++)
{
if(strcmp(q->next->data.name,e)==0)
{
printf("找到该学生\t");
Linklist *p = q->next;
q->next = p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
flag=1;
}
q=q->next;
}
if(flag ==0)
{
printf("该同学不在这个班级里!");
}
printf("\n");
return 0;
}
7、修改学生信息
//修改
int stu_update(Linklist *L)
{
if(NULL == L || list_empty(L))
{
printf("修改失败\n");
return -1;
}
printf("输入要修改的名字:");
char e[20];
scanf("%s",e);
getchar();
Linklist *q=L->next;
int flag=0;
int n,id1,score1;
char name1[20];
for(int i=1;i<=L->len;i++)
{
if(strcmp(q->data.name,e)==0)
{
printf("id:%d\t 姓名:%s\t 成绩:%d\t ",q->data.id,q->data.name,q->data.score);
printf("请输入你想要修改的选项:1.id 2.姓名 3.成绩\n");
scanf("%d",&n);
switch(n)
{
case 1:printf("输入改后的id:\n");
scanf("%d",&id1);
q->data.id=id1;break;
case 2:printf("输入改后的姓名:\n");
scanf("%s",name1);
getchar();
strcpy( q->data.name,name1);break;
case 3:printf("输入改后的成绩:\n");
scanf("%d",&score1);
q->data.score=score1;break;
}
flag=1;
}
q=q->next;
}
if(flag ==0)
{
printf("该同学不在这个班级里!");
}
printf("\n");
return 0;
}
8、遍历学生信息
//遍历
void list_show(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("表空,遍历失败\n");
return;
}
printf("学生信息:\n");
Linklist *q=L->next;
while(q!=NULL)
{
printf("id:%d\t 姓名:%s\t 成绩:%d\t \n",q->data.id,q->data.name,q->data.score);
q=q->next;
}printf("长度:%d",L->len);
printf("\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)
{
//1表示空 0表示非空
return NULL==L->next ? 1: 0;
}
申请结点函数
//定义申请节点函数
Linklist * node_buy(datatype e )
{
Linklist *p=(Linklist *)malloc(sizeof(Linklist));
if(NULL == p)
{
printf("节点申请失败\n");
return NULL;
}
p->data.id =e.id;
strcpy(p->data.name,e.name);
p->data.score=e.score;
p->next = NULL;
return p;
}
尾插
//尾插
int list_insert_tail(Linklist *L,datatype e)
{
if(NULL== L)
{
printf("所给链表不合法\n");
return -1;
}
Linklist *p=node_buy(e);
Linklist *q=L;
while(q->next != NULL)
{
q=q->next;
}
q->next=p;
L->len++;
printf("尾插成功\n");
return 0;
}
尾删
//尾删
int list_delete_tail(Linklist *L)
{
if(NULL ==L || list_empty(L))
{
printf("删除失败\n");
return -1;
}
int temp=L->len-1;
Linklist *q=find_node(L,temp);
Linklist *p=q->next;
q->next = p->next;
free(p);
p=NULL;
L->len--;
printf("尾删成功\n");
return 0;
}
销毁链表
//销毁链表
void list_free(Linklist *L)
{
if(NULL == L)
{
return;
}
while(L->next != NULL)
{
list_delete_tail(L);
}
free(L);
L=NULL;
printf("释放成功\n");
return;
}
linklist.h文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef struct Node1
{
int id;
char name[20];
int score;
}Node1;
typedef Node1 datatype;
typedef struct Node
{
union{
datatype data;
int len;
};
struct Node *next;
}Linklist;
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *L);
//头插
int list_insert_head(Linklist *L,datatype e);
//遍历
void list_show(Linklist *L);
//结点函数
Linklist * node_buy(datatype e);
//尾插
int list_insert_tail(Linklist *L,datatype e);
//任意插
int list_insert_pos(Linklist *L,int pos,datatype e);
//按位置查找
Linklist *find_node(Linklist *L,int pos);
//头删
int list_delete_head(Linklist *L);
//尾删
int list_delete_tail(Linklist *L);
//任意删
int list_delete_pos(Linklist *L,int pos);
//按值查找
int list_search_value(Linklist *L,datatype e);
//按位置修改
int list_update_pos(Linklist *L,int pos,datatype e);
//按值修改
int list_update_value(Linklist *L,datatype old_e,datatype new_e);
//反转
void list_reverse(Linklist *L);
//销毁链表
void list_free(Linklist *L);
//菜单
void menu(Linklist*L,int n);
//输入信息
int stu_input(Linklist *L);
//求最高成绩
int stu_max(Linklist *L);
//成绩降序排序
int stu_j(Linklist *L);
//查找
int stu_search(Linklist *L);
//修改
int stu_update(Linklist *L);
//插入一条信息
int stu_insert(Linklist *L);
//删除指定名字的学生信息
int stu_delete(Linklist *L);
#endif
main.c
#include<stdio.h>
#include"linklist.h"
#include<stdlib.h>
#include<string.h>
int main(int argc, const char *argv[])
{
Linklist *L = list_create();
if(NULL == L)
{
return -1;
}
int n;
menu(L,n);
list_free(L);
L=NULL;
return 0;
}
小生水平堪忧,仅供参考,有错误望指出!
本文展示了一个使用单链表实现的学生管理系统,包括输入学生信息、查找最高分、排序、增删改查等功能。系统通过一系列操作实现了对学生数据的高效管理。
1251





