基於鏈表的學生成績管理系統

基於鏈表的學生成績管理系統,包括了學生基本信息的增刪改查功能,背後是用鏈表來實現,也可以理解爲帶頭結點的鏈表的增刪改查。

可以作爲實踐練手的小項目,也可以當做鏈表初學者的一個小課程設計。

效果圖:

 源碼如下:

studentSystem.cpp

#include "myList.h"

struct Node* infoNode = createList();

//菜單
void menu()
{
	printf("-----------【學生成績管理系統】-------------\n");
	printf("\t\t0.退出系統\n");
	printf("\t\t1.錄入信息\n");
	printf("\t\t2.瀏覽信息\n");
	printf("\t\t3.修改信息\n");
	printf("\t\t4.刪除信息\n");
	printf("\t\t5.查找信息\n");
	printf("--------------------------------------------\n");
}

//用戶選擇事件
void keyDown()
{
	int choose;
	char name[20] = { 0 };
	scanf("%d",&choose);
	struct student tmp;
	struct Node* tmpNode = NULL;
	switch (choose)
	{
	case 0:
		system("pause");
		exit(0);
		break;
	case 1:
		printf("------------------【錄入信息】---------------\n");
		printf("請輸入學生姓名,年齡,性別,成績\n");
		scanf("%s%d%s%d",&tmp.name,&tmp.age,&tmp.sex,&tmp.grade);
		insertNodeByHead(infoNode,tmp);
		break;
	case 2:
		printf("------------------【瀏覽信息】---------------\n");
		printList(infoNode);
		break;
	case 3:
		printf("------------------【修改信息】---------------\n");
		printf("請輸入需要修改的學生名字:\n");
		scanf("%s",&name);
		tmpNode = searchInfoByData(infoNode, name);
		if (tmpNode != NULL)
		{
			printf("請輸入學生姓名,年齡,性別,成績\n");
			scanf("%s%d%s%d", &tmp.name, &tmp.age, &tmp.sex, &tmp.grade);
			modifyInfoByData(infoNode,name,tmp);
		}
		break;
	case 4:
		printf("------------------【刪除信息】---------------\n");
		printf("請輸入需要刪除的學生名字:\n");
		scanf("%s", &name);
		deleteAppoinNode(infoNode,name);
		break;
	case 5:
		printf("------------------【查找信息】---------------\n");
		printf("請輸入需要查找的學生名字:\n");
		scanf("%s", &name);
		tmpNode = searchInfoByData(infoNode, name);
		if (tmpNode != NULL)
		{
			printf("name\tage\tsex\tgrade\n");
			printf("%s\t%d\t%s\t%d\n", tmpNode->data.name, tmpNode->data.age, tmpNode->data.sex, tmpNode->data.grade);
		}
		break;
	default:
		printf("輸入錯誤,請重新輸入!\n");
		system("pause");
		break;
	}
}

int main()
{
	while (1)
	{
		menu();
		keyDown();
		system("pause");
		system("cls");
	}
	system("pause");
	return 0;
}

myList.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
	char name[20];
	int age;
	char sex[5];
	int grade;
};

struct Node
{
	student data;
	struct Node*next;
};

//創建鏈表
struct Node* createList()
{
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	headNode->next = NULL;
	return headNode;
}

//創建節點
struct Node* createNode(student data)
{
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

//插入鏈表(頭插法)
void insertNodeByHead(struct Node* headNode, student data)
{
	struct Node* newNode = createNode(data);
	newNode->next = headNode->next;
	headNode->next = newNode;
}

//刪除結點(根據name進行刪除)
void deleteAppoinNode(struct Node* headNode, char* name)
{
	struct Node* nowNode = headNode->next;
	struct Node* nowNodeFront = headNode;

	if (nowNode == NULL)
	{
		printf("數據爲空,無法刪除!\n");
		return;
	}

	while (strcmp(nowNode->data.name, name))
	{
		nowNodeFront = nowNode;
		nowNode = nowNode->next;
		if (nowNode == NULL)
		{
			printf("未找到指定數據!\n");
			return;
		}
	}

	//找到了指定數據,進行刪除
	nowNodeFront->next = nowNode->next;
	free(nowNode);
	printf("刪除成功!\n");
}

//查找節點(根據名字查找)
struct Node* searchInfoByData(struct Node* headNode, char *name)
{
	struct Node* tmp = headNode->next;
	if (tmp ==NULL)
	{
		printf("無數據!\n");
		return NULL;
	}

	while (strcmp(tmp->data.name, name))
	{
		tmp = tmp->next;
		if (tmp == NULL)
		{
			printf("無此人!\n");
			return NULL;
		}
	}
	//找到,返回當前結點
	return tmp;
}

//修改結點
void modifyInfoByData(struct Node* headNode, char* name_before, student data_after)
{
	char* name = name_before;
	struct Node* tmp = searchInfoByData(headNode, name);
	tmp->data = data_after;
}

//打印鏈表
void printList(struct Node* headNode)
{
	struct Node* tmp = headNode->next;
	printf("name\tage\tsex\tgrade\n");
	while (tmp)
	{
		printf("%s\t%d\t%s\t%d\n",tmp->data.name,tmp->data.age,tmp->data.sex,tmp->data.grade);
		tmp = tmp->next;
	}
	printf("\n");
}

歡迎建議改進

轉載請註明出處,謝謝!

By  Lalmon

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章