数据结构之使用单链表实现的学生信息管理系统

本文展示了一个使用单链表实现的学生管理系统,包括输入学生信息、查找最高分、排序、增删改查等功能。系统通过一系列操作实现了对学生数据的高效管理。

目录

总体评述:

使用单链表实现了7个功能,包括:

1、输入学生姓名和成绩

2、找出成绩最高的学生

3、成绩降序排序

4、增加学生信息

5、查找学生是否在班级

6、删除学生信息

7、修改学生信息

8、遍历学生信息

其他零碎代码:

创建链表

判空

申请结点函数

尾插

尾删

销毁链表

linklist.h文件

main.c


总体评述:

使用单链表实现了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;
}

小生水平堪忧,仅供参考,有错误望指出!

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值