学生信息管理系统(单链表)(C语言)

目录

前言

一、学生信息系统创建

首先是建立结构体,学生信息包括学号姓名和分数,单链表包括data和next,注意Studebt data

存放一个学生的信息,开辟一个空间,避免浪费。

创建学生链表,根据指定学生个数,逐个输入学生信息;

二、test.h(结合枚举)

三、game.h 

四、具体功能实现

4.1 插入学生(插班生)

4.2 逐个显示学生表中所有学生的相关信息

4.3  根据姓名进行查找,返回此学生的学号和成绩

4.4   给定一个学生信息,插入到表中指定的位置

4.5  删除指定位置的学生记录 

五、 game.c 

总结

前言

带验证结果

实验内容:

设计并实现一个包含学生信息(学号,姓名,成绩)的链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 给定一个学生信息,插入到表中指定的位置;

(5) 删除指定位置的学生记录;

一、学生信息系统创建

        用户指定学生人数,输入学生信息,可以不输入,输入就进行链表连接。

        首先是建立结构体,学生信息包括学号姓名和分数,单链表包括data和next,注意Studebt data

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define NUM_MAX 12
#define NAME_MAX 6

//学生结构体
typedef struct Student
{
	char Number[NUM_MAX];
	char Name[NAME_MAX];
	int Grade;
}Student;

//单链表
typedef struct SListNode
{
	Student data;
	struct SListNode* next;
}SListNode;

        存放一个学生的信息,开辟一个空间,避免浪费。

	//开辟空间用来存放学生信息,一次开辟一个
		SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
		if (newnode == NULL)//开辟失败
		{
			printf("malloc error\n");
			exit(-1);
		}
		//开辟成功就录入学生节点的基本信息
		printf("请录入学生基本信息:(学号,姓名,成绩)\n");
		scanf("%s", &((newnode->data).Number)); 
		scanf("%s", &((newnode->data).Name));
		scanf("%d", &((newnode->data).Grade));
		newnode->next = NULL;

         创建学生链表, 根据指定学生个数,逐个输入学生信息;

    int i = 0;
	int n = 0;//学生人数
	SListNode* SList = NULL;//创建空链表
	SListNode* head = NULL;//记录头指针
	SListNode* tail = NULL;//记录尾指针
	//输入N个学生的信息
	scanf("%d", &n);
	while (i++ < n)
	{
		//开辟空间用来存放学生信息,一次开辟一个
		SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
		if (newnode == NULL)//开辟失败
		{
			printf("malloc error\n");
			exit(-1);
		}
		//开辟成功就录入学生节点的基本信息
		printf("请录入学生基本信息:(学号,姓名,成绩)\n");
		scanf("%s", &((newnode->data).Number)); 
		scanf("%s", &((newnode->data).Name));
		scanf("%d", &((newnode->data).Grade));
		newnode->next = NULL;
		//如果空链表,即第一次插入学生信息
		if (head == NULL)
		{
			SList = newnode;
			head = newnode;
			tail = newnode;
		}
		else//链接链表,尾插
		{
			tail->next = newnode;
			tail = newnode;//尾相应的变位置
		}
	}

二、test.c(结合枚举)

#define _CRT_SECURE_NO_WARNINGS 1
/*设计并实现一个包含学生信息(学号,姓名,成绩)的链表*/
#include"game.h"
enum Option
{
	EXIT,//退出0
	ADD,//尾插学生信息
	SHOW,//逐个显示学生表中所有学生的相关信息;
	FIND,//根据姓名进行查找,返回此学生的学号和成绩;
	INSERT,//给定一个学生信息,插入到表中指定的位置;
	DELETE,//删除指定位置的学生记录;
}input;
void menu()
{
	printf("*************************************** \n");
	printf("**** 0.退出学生管理系统 *****************  \n");
	printf("**** 1.尾插学生信息 **********************\n");
	printf("**** 2.逐个显示学生表中所有学生的相关信息 **********************\n");
	printf("**** 3.根据姓名进行查找,返回此学生的学号和成绩 *****************\n");
	printf("**** 4.给定一个学生信息,插入到表中指定的位置 *******************\n");
	printf("**** 5.删除指定位置的学生记录 ********************************\n");
	printf("**********************************************************\n");
}
int main()
{
	//创建学生链表
	int i = 0;
	int n = 0;//学生人数
	SListNode* SList = NULL;//创建空链表
	SListNode* head = NULL;//记录头指针
	SListNode* tail = NULL;//记录尾指针
	//输入N个学生的信息
	scanf("%d", &n);
	while (i++ < n)
	{
		//开辟空间用来存放学生信息,一次开辟一个
		SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
		if (newnode == NULL)//开辟失败
		{
			printf("malloc error\n");
			exit(-1);
		}
		//开辟成功就录入学生节点的基本信息
		printf("请录入学生基本信息:(学号,姓名,成绩)\n");
		scanf("%s", &((newnode->data).Number)); 
		scanf("%s", &((newnode->data).Name));
		scanf("%d", &((newnode->data).Grade));
		newnode->next = NULL;
		//如果空链表,即第一次插入学生信息
		if (head == NULL)
		{
			SList = newnode;
			head = newnode;
			tail = newnode;
		}
		else//链接链表,尾插
		{
			tail->next = newnode;
			tail = newnode;//尾相应的变位置
		}
	}
	do
	{
		menu();
		printf("请选择->\n");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			free(SList);
			SList = NULL;
			printf("退出学生管理系统\n");
			break;
		case ADD:
			printf("插入学生信息:>\n");
			SListPushBack(&SList);
			break;
		case SHOW:
			printf("打印学生信息:>\n");
			SListPrint(SList);
			break;
		case FIND:
			printf("通过姓名查找:>\n");
			SListNode* SL = SListFind(SList);
			if (SL == NULL)
			{
				printf("找不到!\n");
			}
			else
			{
				printf("%-13s\t%-6s\t%-4d\t\n", (SL->data).Number, (SL->data).Name, (SL->data).Grade);
			}
			break;
		case INSERT:
		{
			//先调用一下,找到位置
			SListNode* pos = SListFind(SList);
			if (pos == NULL)
			{
				printf("找不到!\n");
			}
			else
			{
				printf("指定位置插入学生信息:\n");
				SListInsert(&SList, pos);
			}
			SListPrint(SList);
			break;
		}
		case DELETE:
		{
			SListNode* del = SListFind(SList);
			if (del == NULL)
			{
				printf("找不到!\n");
				printf("无法删除!\n");
			}
			else
			{
				printf("删除指定位置学生信息后的学生信息:\n");
				SListDelete(&SList, del);
				SListPrint(SList);
			}
			break;
		}
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
	return 0;
}

三、game.h 

#define _CRT_SECURE_NO_WARNINGS 1
/*设计并实现一个包含学生信息(学号,姓名,成绩)的链表*/

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define NUM_MAX 12
#define NAME_MAX 6

//学生结构体
typedef struct Student
{
	char Number[NUM_MAX];
	char Name[NAME_MAX];
	int Grade;
}Student;

//单链表
typedef struct SListNode
{
	Student data;
	struct SListNode* next;
}SListNode;

void SListPrint(SListNode* phead);
void SListPushBack(SListNode** pphead);
SListNode* SListFind(SListNode* phead);
void SListInsert(SListNode** pphead, SListNode* pos);
void SListDelete(SListNode** pphead, SListNode* del);

四、具体功能实现

4.1 插入学生(插班生)

void SListPushBack(SListNode** pphead)
{
	assert(pphead);
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	//输入插入的学生基本信息
	printf("请输入插班生的基本信息:(学号,姓名,成绩)>\n");
	scanf("%s", &((newnode->data).Number));
	scanf("%s", &((newnode->data).Name));
	scanf("%d", &((newnode->data).Grade));
	newnode->next = NULL;
	if (*pphead == NULL)//pphead接收的&SList,*pphead就是SList本身
	{
		//这就是说该链表无节点,可以直接插入
		*pphead = newnode;//现在让SList指向newnode即可插入成功
	}
	else
	{//找尾,尾插即可
		SListNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

4.2 逐个显示学生表中所有学生的相关信息

void SListPrint(SListNode* phead)
{
	assert(phead);
	SListNode* cur = phead;
	while (cur != NULL)
	{
		printf("%-13s\t%-6s\t%-4d\t\n", (cur->data).Number, (cur->data).Name, (cur->data).Grade);
		cur = cur->next;
	}
}

4.3  根据姓名进行查找,返回此学生的学号和成绩

SListNode* SListFind(SListNode* phead)
{
	assert(phead);
	SListNode* cur = phead;
	char Name[NAME_MAX];
	printf("请输入你要查找的人的姓名:>\n");
	scanf("%s", &Name);
	while (cur != NULL)//只有这样才能检查最后一个节点
	{
		if ((strcmp(((cur->data).Name),Name)) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;//找不到返回NULL
}

  

4.4   给定一个学生信息,插入到表中指定的位置

void SListInsert(SListNode** pphead, SListNode* pos)
{
	assert(pphead);
	assert(pos);
	//1.空链表
	if (*pphead == NULL)
	{
		return;//空链表都没有pos位置,无意义
	}
	//2.单节点
	else if ((*pphead)->next == NULL)
	{
		SListPushBack(pphead);//pphead是SList的地址
	}
	//3.多节点
	else
	{
		SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
		//输入插入的学生基本信息
		printf("在pos位置插入的学生的基本信息:(学号,姓名,成绩)>\n");
		scanf("%s", &((newnode->data).Number));
		scanf("%s", &((newnode->data).Name));
		scanf("%d", &((newnode->data).Grade));
		newnode->next = NULL;
		SListNode* cur = *pphead;
		while (cur != pos)
		{
			cur = cur->next;
		}
		newnode->next = pos->next;
		cur->next = newnode;
	}
}

  

4.5  删除指定位置的学生记录 

void SListDelete(SListNode** pphead, SListNode* del)
{
	assert(pphead);
	assert(del);
	if (*pphead == NULL)
	{
		return;//空链表没有删除的必要
	}
	else if ((*pphead) == del)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SListNode* cur = *pphead;
		while (cur->next != del)
		{
			cur = cur->next;
		}
		cur->next = del->next;
		free(del);
		del = NULL;
	}
}

五、 game.c 

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

/*	EXIT,//退出0
	ADD,//插班生;
	SHOW,//逐个显示学生表中所有学生的相关信息;
	FIND,//根据姓名进行查找,返回此学生的学号和成绩;
	INSERT,//给定一个学生信息,插入到表中指定的位置;
	DELETE,//删除指定位置的学生记录;*/

	
//插入学生,尾插
void SListPushBack(SListNode** pphead)
{
	assert(pphead);
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	//输入插入的学生基本信息
	printf("请输入插班生的基本信息:(学号,姓名,成绩)>\n");
	scanf("%s", &((newnode->data).Number));
	scanf("%s", &((newnode->data).Name));
	scanf("%d", &((newnode->data).Grade));
	newnode->next = NULL;
	if (*pphead == NULL)//pphead接收的&SList,*pphead就是SList本身
	{
		//这就是说该链表无节点,可以直接插入
		*pphead = newnode;//现在让SList指向newnode即可插入成功
	}
	else
	{//找尾,尾插即可
		SListNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

//打印链表
void SListPrint(SListNode* phead)
{
	assert(phead);
	SListNode* cur = phead;
	while (cur != NULL)
	{
		printf("%-13s\t%-6s\t%-4d\t\n", (cur->data).Number, (cur->data).Name, (cur->data).Grade);
		cur = cur->next;
	}
}


//根据姓名进行查找
SListNode* SListFind(SListNode* phead)
{
	assert(phead);
	SListNode* cur = phead;
	char Name[NAME_MAX];
	printf("请输入你要查找的人的姓名:>\n");
	scanf("%s", &Name);
	while (cur != NULL)//只有这样才能检查最后一个节点
	{
		if ((strcmp(((cur->data).Name),Name)) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;//找不到返回NULL
}


//给定一个学生信息,插入到表中pos位置
void SListInsert(SListNode** pphead, SListNode* pos)
{
	assert(pphead);
	assert(pos);
	//1.空链表
	if (*pphead == NULL)
	{
		return;//空链表都没有pos位置,无意义
	}
	//2.单节点
	else if ((*pphead)->next == NULL)
	{
		SListPushBack(pphead);//pphead是SList的地址
	}
	//3.多节点
	else
	{
		SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
		//输入插入的学生基本信息
		printf("在pos位置插入的学生的基本信息:(学号,姓名,成绩)>\n");
		scanf("%s", &((newnode->data).Number));
		scanf("%s", &((newnode->data).Name));
		scanf("%d", &((newnode->data).Grade));
		newnode->next = NULL;
		SListNode* cur = *pphead;
		while (cur != pos)
		{
			cur = cur->next;
		}
		newnode->next = pos->next;
		cur->next = newnode;
	}
}


//删除指定位置的学生信息

void SListDelete(SListNode** pphead, SListNode* del)
{
	assert(pphead);
	assert(del);
	if (*pphead == NULL)
	{
		return;//空链表没有删除的必要
	}
	else if ((*pphead) == del)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SListNode* cur = *pphead;
		while (cur->next != del)
		{
			cur = cur->next;
		}
		cur->next = del->next;
		free(del);
		del = NULL;
	}
}



总结

        结合单链表的实现和通讯录的实现,可以较好的完成!

linux成绩管理:

  • 20
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的学生信息管理系统C语言单链表实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student { char name[20]; int age; struct student *next; } Student; Student *head = NULL; void add_student() { Student *new_student = (Student*)malloc(sizeof(Student)); printf("Enter student name: "); scanf("%s", new_student->name); printf("Enter student age: "); scanf("%d", &new_student->age); new_student->next = NULL; if (head == NULL) { head = new_student; } else { Student *current = head; while (current->next != NULL) { current = current->next; } current->next = new_student; } printf("Student added successfully!\n"); } void delete_student() { if (head == NULL) { printf("No students to delete!\n"); return; } char name[20]; printf("Enter student name to delete: "); scanf("%s", name); Student *current = head; Student *previous = NULL; while (current != NULL && strcmp(current->name, name) != 0) { previous = current; current = current->next; } if (current == NULL) { printf("Student not found!\n"); return; } if (previous == NULL) { head = current->next; } else { previous->next = current->next; } free(current); printf("Student deleted successfully!\n"); } void display_students() { if (head == NULL) { printf("No students to display!\n"); return; } printf("Name\tAge\n"); printf("----\t---\n"); Student *current = head; while (current != NULL) { printf("%s\t%d\n", current->name, current->age); current = current->next; } } int main() { int choice = 0; do { printf("\nStudent Information Management System\n"); printf("-------------------------------------\n"); printf("1. Add student\n"); printf("2. Delete student\n"); printf("3. Display students\n"); printf("4. Exit\n\n"); printf("Enter your choice (1-4): "); scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: delete_student(); break; case 3: display_students(); break; case 4: printf("Exiting...\n"); break; default: printf("Invalid choice! Please try again.\n"); break; } } while (choice != 4); return 0; } ``` 该程序使用单链表来存储学生信息,可以添加、删除和显示学生信息。在添加学生时,程序会从用户获取学生的名字和年龄,然后将其添加到链表的末尾。在删除学生时,程序会要求用户输入要删除的学生的名字,然后从链表中删除该学生。在显示学生时,程序会遍历链表并打印每个学生的名字和年龄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值