数据结构7/23—链表实现简单的学生信息管理系统

目录

定义结构体存储学生信息(姓名 成绩):

功能实现,各种功能函数如下↓

菜单函数:

创建链表函数

判断是否为空的判空函数

插入函数(头插方式实现)

遍历链表函数

排序输出(升序)

输出最高分学生信息

以名字查找该学生的前驱节点

通过名字删除学生信息

按照名字查找学生信息并输出信息

按姓名修改学生信息

全部代码

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;
}

这就是一个简单学生管理系统仅供大家参考,欢迎大家修改完善使用

  • 18
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学生通信录管理系统可以通过使用线性链表实现。下面是一些基本操作: 1. 定义结构体 首先,我们需要定义一个结构体表示学生通信录中的每个记录,包括学生姓名、学号、联系电话等信息。 ```c typedef struct student { char name[20]; char id[10]; char phone[20]; struct student *next; } Student; ``` 2. 创建链表 然后,我们可以创建一个头指针指向链表的头节点,用于存储所有学生的信息。 ```c Student *head = NULL; ``` 3. 插入节点 当用户需要添加新的学生信息时,我们可以通过以下代码将信息插入到链表中。 ```c void insert(Student **head_ref, char name[], char id[], char phone[]) { // 创建新节点 Student *new_node = (Student*)malloc(sizeof(Student)); strcpy(new_node->name, name); strcpy(new_node->id, id); strcpy(new_node->phone, phone); new_node->next = NULL; // 如果链表为空,则将新节点作为头节点 if (*head_ref == NULL) { *head_ref = new_node; return; } // 找到链表的最后一个节点并将新节点插入到末尾 Student *last_node = *head_ref; while (last_node->next != NULL) { last_node = last_node->next; } last_node->next = new_node; } ``` 4. 删除节点 如果用户需要删除某个学生信息,我们可以通过以下代码从链表中删除该节点。 ```c void delete_student(Student **head_ref, char id[]) { // 如果链表为空,直接返回 if (*head_ref == NULL) { return; } // 如果第一个节点就是要删除的节点 if (strcmp((*head_ref)->id, id) == 0) { Student *temp = *head_ref; *head_ref = (*head_ref)->next; free(temp); return; } // 在链表中查找要删除的节点并删除 Student *prev_node = *head_ref; Student *cur_node = prev_node->next; while (cur_node != NULL && strcmp(cur_node->id, id) != 0) { prev_node = cur_node; cur_node = cur_node->next; } if (cur_node != NULL) { prev_node->next = cur_node->next; free(cur_node); } } ``` 5. 修改节点 如果用户需要修改某个学生的信息,我们可以通过以下代码找到该节点并修改其信息。 ```c void modify_student(Student *head, char id[], char new_phone[]) { // 在链表中查找要修改的节点并修改 Student *cur_node = head; while (cur_node != NULL && strcmp(cur_node->id, id) != 0) { cur_node = cur_node->next; } if (cur_node != NULL) { strcpy(cur_node->phone, new_phone); } } ``` 6. 查找节点 最后,如果用户需要查找某个学生的信息,我们可以通过以下代码在链表中查找该节点。 ```c void search_student(Student *head, char id[]) { // 在链表中查找要查找的节点并输出其信息 Student *cur_node = head; while (cur_node != NULL && strcmp(cur_node->id, id) != 0) { cur_node = cur_node->next; } if (cur_node != NULL) { printf("Name: %s\n", cur_node->name); printf("ID: %s\n", cur_node->id); printf("Phone: %s\n", cur_node->phone); } else { printf("Student not found.\n"); } } ``` 这样,我们就可以利用线性链表实现学生通信录管理系统了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值