基於鏈表的學生成績管理系統,包括了學生基本信息的增刪改查功能,背後是用鏈表來實現,也可以理解爲帶頭結點的鏈表的增刪改查。
可以作爲實踐練手的小項目,也可以當做鏈表初學者的一個小課程設計。
效果圖:
源碼如下:
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