網站首頁 編程語言 正文
鏈表是一種常見的基礎數據結構,結構體指針在這里得到了充分的利用。
鏈表可以動態的進行存儲分配,也就是說,鏈表是一個功能極為強大的數組,他可以在節點中定義多種數據類型,還可以根據需要隨意增添,刪除,插入節點。
鏈表都有一個頭指針,一般以head來表示,存放的是一個地址。鏈表中的節點分為兩類,頭結點和一般節點,頭結點是沒有數據域的。鏈表中每個節點都分為兩部分,一個數據域,一個是指針域。
說到這里你應該就明白了,鏈表就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最后一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),鏈表到此結束。
作為有強大功能的鏈表,對他的操作當然有許多,比如:鏈表的創建,修改,刪除,插入,輸出,排序,反序,清空鏈表的元素,求鏈表的長度等等。
本文就將利用C語言中的鏈表實現一個簡單的學生成績管理系統
示例代碼
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
int choice = 0;
int mima=123456;
int zhanghao=123456;
int summ=0;//學生總數
int i=0,j=0,k=0;//數學英語樹脂不及格的人數
using namespace std;
typedef struct STUDENT
{
int num; //學號
char name[15]; //姓名
char major[15]; //專業
double math; //數學成績
double english; //英語成績
double shuzhi; //IKUN樹脂分
double average; //平均分
double sum; //總分
}student;
typedef struct Node
{
student data;
struct Node *next;
}Node,*LinkList;
void CreateList(LinkList &l); //創建鏈表
void ZenjaiNode(LinkList &l, student e); //增加節點
int ShanchuNode(LinkList &l, int num); //刪除節點
int XuigaiNode(LinkList &l, int num, student e); //修改節點
int Chazhao(LinkList l, int num, student &e); //查找節點
void ZenjiaStudent(LinkList &l); //增加學生
void ShanchuStudent(LinkList &l); //刪除學生
void XuigaiStudent(LinkList &l); //修改學生
void ChazhaoStudent(LinkList l); //查找學生
void XianshiStudent(LinkList l); //顯示學生
void menu(); //主菜單
void math();
void english();
void shuzhi();
void mathmax();
void englishmax();
void shuzhimax();
void CreateList(LinkList &l)//創建鏈表,頭節點
{
l=(LinkList)malloc(sizeof(Node));
l->next=NULL;
}
void ZenjiaNode(LinkList &l, student e)//尾插節點
{
Node*q=(LinkList)malloc(sizeof(Node));
q->data=e;
q->next=NULL;
Node*p=l;
while(p->next)
p=p->next;
p->next=q;
}
int ShanchuNode(LinkList &l, int num)//刪除節點
{
Node *p,*q;
p=l;
while(p->next)
{
q=p->next;
if(num==(q->data).num)
{
if((q->data).math<60)
i--;
if((q->data).english<60)
j--;
if((q->data).shuzhi<60)
k--;
p->next=q->next;
free(q);
return 0;//刪除完成
}
p=p->next;
}
return 1;//未找到
}
int XuigaiNode(LinkList &l, int num, student e)//修改節點
{
Node *p,*q;
p=l;
while(p->next)
{
q=p->next;
if(num==(q->data).num)
{
q->data=e;
return 0;//修改完成
}
p=p->next;
}
return 1;//修改失敗
}
int ChazhaoNode(LinkList l, int num,student &e)//查找節點
{
Node *p,*q;
p=l;
while(p->next)
{
q=p->next;
if(num==(q->data).num)
{
e=q->data;
return 0;//查找完成
}
p=p->next;
}
return 1;//查找失敗
}
void ZenjiaStudent(LinkList &l) //增加學生
{
summ++;
student e;
printf("小黑子請輸入你想錄入IKUN的成績吧!\n") ;
printf("學號\n");
scanf("%d",&e.num);
//getchar();
printf("姓名\n");
scanf("%s",e.name);
//getchar();
printf("專業\n");
scanf("%s",e.major);
//getchar();
printf("數學成績\n");
scanf("%lf",&e.math);
printf("英語成績\n");
scanf("%lf",&e.english);
printf("IKUN樹脂分\n");
scanf("%lf",&e.shuzhi);
e.average=(e.math+e.english+e.shuzhi)/3;
e.sum=e.math+e.english+e.shuzhi;
ZenjiaNode(l, e);
system("pause");
}
void ShanchuStudent(LinkList &l) //刪除學生
{
summ--;
int num;
printf("請輸入要刪除的IKUN的學號\n");
scanf("%d",&num);
if(ShanchuNode( l, num)==1)
printf("查找失敗哎呦,你個黑子冒充IKUN,香翅撈飯食不食\n");
else
{
printf("刪除成功了,獎勵一個蛋\n");
}
system("pause");
}
void XuigaiStudent(LinkList &l) //修改學生信息
{
student e;
int num;
char x;
printf("請輸入要修改IKUN的學號\n");
scanf("%d",&num);
printf("請重新輸入信息吧\n");
printf("請輸入學號\n");
scanf("%d",&e.num);
printf("請輸入姓名\n");
scanf("%s",e.name);
printf("請輸入專業\n");
scanf("%s",e.major);
printf("請輸入數學成績\n");
scanf("%lf",&e.math);
printf("請輸入英語成績\n");
scanf("%lf",&e.english);
printf("請輸入樹脂分\n");
scanf("%lf",&e.shuzhi);
e.average=(e.math+e.english+e.shuzhi)/3;
e.sum=e.math+e.english+e.shuzhi;
if( XuigaiNode(l,num,e)==1)
printf("未找到該IKUN\n");
else
printf("修改完成\n");
system("pause");
}
void ChazhaoStudent(LinkList l) //查找學生
{
student e;
int num;
printf("請輸入要查找的IKUN學號\n");
scanf("%d",&num);
if(ChazhaoNode( l, num,e)==1)
printf("沒有找到哦\n");
else
{
printf("學號 姓名 專業 數學成績 英語成績 樹脂分 平均分 總分\n");
printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum);
system("pause");
}
}
void XianshiStudent(LinkList l) //顯示學生
{
printf("學號 姓名 專業 數學成績 英語成績 樹脂分 平均分 總分\n");
Node *p=l;
student e;
while(p->next)
{
e=(p->next)->data;
printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum);
p=p->next;
}system("pause");
}
void paixu(LinkList l)//總分排序
{
student e;
Node *p,*q;
p=l->next;
if(p->next==NULL)
printf("請輸入IKUN之后再來吧\n");
else
{
while(p->next!=NULL)
{
q=p->next;
while(q!=NULL)
{
if(p->data.average<q->data.average)
{
e=p->data;
p->data=q->data;
q->data=e;
}
q=q->next;
}
p=p->next;
}
printf("排序成功\n");
}
system("pause");
}
void math(LinkList l)//數學不及格
{
Node *p;
student e;
p=l;
while(p->next!=NULL)
{
e=(p->next)->data;
if(e.math<60)
{
printf("數學不及格學員如下:\n");
printf("姓名:%s 成績:%.2f\n",e.name,e.math);
}
p=p->next;
i++;
}
if(i==0&&summ!=0)
{
printf("所有人都及格了呢\n");
}
else
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void english(LinkList l)//英語不及格
{
Node *p;
student e;
p=l;
while(p->next!=NULL)
{
e=(p->next)->data;
if(e.english<60)
{
printf("英語不及格學員如下:\n");
printf("姓名:%s 成績:%.2f\n",e.name,e.english);
j++;
}
p=p->next;
}
if(j==0&&summ!=0)
{
printf("所有人都及格了呢\n");
}
else
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void shuzhi(LinkList l)//樹脂不及格
{
Node *p;
student e;
p=l;
while(p->next!=NULL)
{
e=(p->next)->data;
if(e.shuzhi<60)
{
printf("樹脂不及格學員如下:\n");
printf("姓名:%s 成績:%.2f\n",e.name,e.shuzhi);
k++;
}
p=p->next;
}
if(k==0&&summ!=0)
{
printf("所有人都及格了呢\n");
}
else
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void mathmax(LinkList l)
{
Node *p,*q;
double max;
student e,f;
p=l;
q=p->next;
e=(p->next)->data;
max=e.math;
while(q->next!=NULL)
{
f=(q->next)->data;
if(f.math>max)
max=f.math;
q=q->next;
}
p=l;
q=l->next;
printf("數學最高分為:\n");
while(p->next!=NULL)
{
f=(p->next)->data;
if(f.math==max)
printf("學生:%s 成績:%lf\n",f.name,f.math);
p=p->next;
}
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void englishmax(LinkList l)
{
Node *p,*q;
double max;
student e,f;
p=l;
q=p->next;
e=(p->next)->data;
max=e.english;
while(q->next!=NULL)
{
f=(q->next)->data;
if(f.english>max)
max=f.english;
q=q->next;
}
p=l;
q=l->next;
printf("英語最高分為:\n");
while(p->next!=NULL)
{
f=(p->next)->data;
if(f.english==max)
printf("學生:%s 成績:%lf\n",f.name,f.english);
p=p->next;
}
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void shuzhimax(LinkList l)
{
Node *p,*q;
double max;
student e,f;
p=l;
q=p->next;
e=(p->next)->data;
max=e.shuzhi;
while(q->next!=NULL)
{
f=(q->next)->data;
if(f.shuzhi>max)
max=f.shuzhi;
q=q->next;
}
p=l;
q=l->next;
printf("樹脂最高分為:\n");
while(p->next!=NULL)
{
f=(p->next)->data;
if(f.shuzhi==max)
printf("學生:%s 成績:%lf\n",f.name,f.shuzhi);
p=p->next;
}
if(summ==0)
printf("系統人數為0,請添加信息后再試\n");
system("pause");
}
void menu()
{
system("cls");
printf(" ***************IKUN成績管理系統***************\n");
printf(" \t** **\n");
printf(" \t** author:南工第一IKUN **\n");
printf(" \t** **\n");
printf(" ** 1.錄入新的IKUN的成績 **\n");
printf(" ** 2.按學號刪除IKUN的成績 **\n");
printf(" ** 3.按學號修改IKUN的成績 **\n");
printf(" ** 4.查找IKUN的成績 **\n");
printf(" ** 5.顯示IKUN們的成績 **\n");
printf(" \t** 6.根據總分排序 **\n");
printf(" \t** 7.顯示數學不及格的IKUN **\n");
printf(" \t** 8.顯示英語不及格的IKUN **\n");
printf(" \t** 9.顯示樹脂不及格的小黑子 **\n");
printf(" \t** 10.查看數學最高分 **\n");
printf(" \t** 11.查看英語最高分 **\n");
printf(" \t** 12.查看樹脂最高分 **\n");
//printf(" ** 13.退出登錄 **\n");
printf(" \t** 13.保存數據到文件 **\n");
printf(" \t** 14.從文件中讀取數據 **\n");
printf(" \t** 15.插入一個新學生 **\n");
printf(" ** 16.退出登錄 **\n");
printf(" ** 0.退出成績管理系統 **\n");
printf(" **********************************************\n");
printf(" 請輸入你想進行的操作:0-13 \n");
}
void xuigai2()//找回密碼之后登錄
{
int mi=0;
int caozuo=0;
int zhang=0;
int anns=0;
while(1)
{
printf("請輸入你的賬號\n");
scanf("%d",&zhang);
printf("請輸入你的密碼\n");
scanf("%d",&mi);
if(mi==mima&&zhang==zhanghao)
{
choice = 1;
printf("登錄成功!\n");
system("pause");
system("cls");
break;
}
else
{
system("cls");
anns++;
if(anns<5)
printf("賬號或密碼有誤,請重新輸入\n");
if(anns==5)
printf("你干嘛哎呦,都錯五次了,好好想想再來吧!\n");
}
if(anns==5)break;
}
}
void zhaohui()//找回密碼
{
int guodu;
int guodu2;
int zhang;//輸入要找回密碼的賬號
while(1)
{
printf("請輸入要找回密碼的賬號\n");
scanf("%d",&zhang);
if(zhang==123456)
{
printf("請輸入更改后的密碼:");
scanf("%d",&guodu);
printf("請再次輸入更改后的密碼:");
scanf("%d",&guodu2);
if(guodu==guodu2)
{
mima=guodu2;
printf("修改成功,請登陸吧\n");
system("pause");
xuigai2();
break;
}
else
{
system("cls");
printf("兩次輸入不同,修改失敗,請重新輸入賬號\n");
}
}
else
{
system("cls");
printf("該賬號不存在,請重新輸入賬號\n");
}
}
}
void charu(LinkList l)
{
Node *p,*y;
int num2;
printf("請輸入要插入的位置(誰之后)\n");
scanf("%d",&num2);
p=l->next;
while(p!=NULL)
{
if(num2==p->data.num)
{
y=p->next;
summ++;
student e;
printf("小黑子請輸入你想錄入IKUN的成績吧!\n") ;
printf("學號\n");
scanf("%d",&e.num);
printf("姓名\n");
scanf("%s",e.name);
printf("專業\n");
scanf("%s",e.major);
printf("數學成績\n");
scanf("%lf",&e.math);
printf("英語成績\n");
scanf("%lf",&e.english);
printf("IKUN樹脂分\n");
scanf("%lf",&e.shuzhi);
e.average=(e.math+e.english+e.shuzhi)/3;
e.sum=e.math+e.english+e.shuzhi;
Node*q=(LinkList)malloc(sizeof(Node));
q->data=e;
q->next=y;
p->next=q;
printf("插入成功\n");
break;
}
else
p=p->next;
}
if(p==NULL)
printf("插入失敗\n");
system("pause");
}
void guanli()//登錄界面
{
int mi=0;
int caozuo=0;
int zhang=0;
int anns=0;
/*printf(" **********登錄界面**********\n");
printf(" ** 賬號: **\n");
printf(" ** 密碼: **\n");
printf(" ** 輸入0找回密碼 **\n");
printf(" ****************************\n");*/
printf(" **********登錄界面**********\n");
printf(" ** 1管理員登錄1 **\n");
printf(" ** ovo **\n");
printf(" ** 0找回密碼0 **\n");
printf(" ****************************\n");
printf("請輸入想進行的操作:0-1\n");
scanf("%d",&caozuo);
if(caozuo==1)
{
while(1)
{
printf("請輸入你的賬號\n");
scanf("%d",&zhang);
printf("請輸入你的密碼\n");
scanf("%d",&mi);
if(mi==mima&&zhang==zhanghao)
{
choice = 1;
printf("登錄成功!\n");
system("pause");
system("cls");
break;
}
else
{
system("cls");
anns++;
if(anns<5)
printf("賬號或密碼有誤,請重新輸入\n");
if(anns==5)
printf("你干嘛哎呦,都錯五次了,好好想想再來吧!\n");
}
if(anns==5)break;
}
}
else if(caozuo==0)
{
zhaohui();
}
}
void ReadFile(LinkList &l)//從文件中讀取數據
{
FILE *fp;
fp=fopen("D:/b.txt","r");
if(fp==NULL)
{
printf("Can not open the file\n");
exit(1);
}
else
{
CreateList(l);
student e;
while(fscanf(fp,"%d %s %s %lf %lf %lf %lf %lf\n",&e.num,e.name,e.major,&e.math,&e.english,&e.shuzhi,&e.average,&e.sum)!=EOF)
{
ZenjiaNode(l,e);
}
printf("已成功讀取數據\n");
}
system("pause");
fclose(fp);
}
void WriteFile(LinkList &l)//保存數據到文件
{
FILE *fp ;
fp = fopen("D:/b.txt", "w");
if(fp == NULL)
{
printf("Can not open the file\n");
exit(1);
}
Node *p = l->next;
student e;
while(p!=NULL )
{
fprintf(fp,"%-8d ",p->data.num);
fprintf(fp,"%-8s ",p->data.name);
fprintf(fp,"%-8s ",p->data.major);
fprintf(fp,"%-16lf ",p->data.math);
fprintf(fp,"%-16lf ",p->data.english);
fprintf(fp,"%-16lf ",p->data.shuzhi);
fprintf(fp,"%-16lf ",p->data.average);
fprintf(fp,"%-16lf ",p->data.sum);
fprintf(fp,"\n");
p = p -> next;
}
printf("保存成功\n");
fclose(fp);
system("pause");
}
int main()
{
int x;
LinkList l;
CreateList(l);
guanli();
while(choice)
{
menu();
scanf("%d", &choice);
switch(choice)
{
case 1: ZenjiaStudent(l);//增加學生
break;
case 2: ShanchuStudent(l); //刪除學生
break;
case 3: XuigaiStudent(l);//修改學生
break;
case 4: ChazhaoStudent(l);//查找學生
break;
case 5: XianshiStudent(l); //顯示所有學生
break;
case 6: paixu(l);//排序
break;
case 7:math(l);//數學不及格
break;
case 8:english(l);//英語不及格
break;
case 9:shuzhi(l);//樹脂不及格
break;
case 10:mathmax(l);
break;
case 11:englishmax(l);
break;
case 12:shuzhimax(l);
break;
case 13:WriteFile(l);
break;
case 14:ReadFile(l);
break;
case 15:charu(l);
break;
case 16:system("cls");
guanli();
break;
default:printf("謝謝您的使用\n");
break;
}
}
return 0;
}
原文鏈接:https://blog.csdn.net/m0_73208807/article/details/127903029
相關推薦
- 2023-01-13 Go?cobra庫使用教程_Golang
- 2023-07-31 el-tree自定義展示圖標
- 2023-01-08 基于C#實現屏幕取色器的示例詳解_C#教程
- 2022-09-06 React封裝CustomSelect組件思路詳解_React
- 2022-11-24 Django?ORM?F對象和Q對象查詢_python
- 2022-12-07 C++成員函數后面加override問題_C 語言
- 2023-05-16 Golang的鎖機制使用及說明_Golang
- 2022-06-20 一文搞懂Go語言中條件語句的使用_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支