C語言動態鏈表數據結構實現的學生信息項目


注:此項目來源於呂鑫老師的教程

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
using namespace std;

struct SUser
{
    int nNum;
    char sName[20];
    float fMath;
};

typedef SUser DATA;

struct SNode
{
    DATA data;//28個字節
    SNode* pNext;//指針變量,4個字節
};

SNode* g_Head = NULL;

//頭部添加
void AddHeand(DATA data) { SNode* pNew = (SNode*)malloc(sizeof(SNode)); pNew->data = data; pNew->pNext = g_Head; g_Head = pNew; } //尾部添加 void AddTail(DATA data) { SNode* pNew =(SNode*)malloc(sizeof(SNode)); pNew->data =data; pNew->pNext = NULL; if (!g_Head)//鏈表為空時 { g_Head = pNew; return; } SNode* p = g_Head; while(p->pNext!=NULL) { p = p->pNext; } p->pNext = pNew; } //保存到文件中 void Save() { FILE* fp = fopen("study.dat","w"); if (!fp) { return; } SNode* p = g_Head; while(p) { //fwrite(&p->data,1,sizeof(p->data),fp); fwrite(p,1,sizeof(p->data),fp ); p = p->pNext; } fclose(fp); } //從文件中讀取 void Load() { FILE* fp = fopen("study.dat","r"); if (!fp) { return; } DATA data; while(fread(&data,1,sizeof(data),fp)==sizeof(data)) AddTail(data); fclose(fp); } //打印 void PrintAll() { SNode* p = g_Head; int i =0; /*if (!p) { printf("當前鏈表為空!\n"); return; }*/ puts("學號\t姓名\t數學"); while (p) { printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); ++i; p=p->pNext; } printf("總共%d條記錄\n",i); system("pause"); } void Input(int nDir) { DATA data; printf("請輸入學號:"); scanf_s("%d",&data.nNum); printf("請輸入姓名:"); scanf_s("%s",data.sName,sizeof(data.sName)); printf("請輸入數學成績:"); scanf_s("%f",&data.fMath); if (nDir == 1) { AddHeand(data); } else { AddTail(data); } Save(); PrintAll(); } int AddMenu() { system("cls"); puts("\n\n\t\t1、向頭部插入:"); puts("\t\t2、向尾部插入:"); puts("\t\t0、回到主菜單:"); int i = 0; scanf_s("%d",&i); switch(i) { case 1: case 2: Input(i); break; } return i; } int Judge(SNode* q,SNode* m,int index) { switch(index) { case 1://姓名 return strcmp(q->data.sName,m->data.sName)<0; case 2://學號 return q->data.nNum < m->data.nNum; case 3://成績 return q->data.fMath < m->data.fMath; } return 0; }
//排序
void Sort(int index) { SNode* p = g_Head; if (!p) { return; } while (p->pNext) { SNode* q = p->pNext; SNode* m = p; while(q) { if (Judge(q,m,index)) { m = q; } q = q->pNext; } if (m != p)//不等時交換 { DATA t = p->data; p->data=m->data; m->data = t; } p = p->pNext; } system("pause"); }
//按學號排序
void SortByNum() { SNode* p = g_Head; if (!p) { return; } while (p->pNext) { SNode* q = p->pNext; SNode* m = p; while(q) { if (q->data.nNum < m->data.nNum) { m = q; } q = q->pNext; } if (m != p)//不等時交換 { DATA t = p->data; p->data=m->data; m->data = t; } p = p->pNext; } system("pause"); }
//按姓名排序
void SortByName() { SNode* p = g_Head; if (!p) { return; } while (p->pNext) { SNode* q = p->pNext; SNode* m = p; while(q) { if (strcmp(q->data.sName, m->data.sName)<0) { m = q; } q = q->pNext; } if (m != p)//不等時交換 { DATA t = p->data; p->data=m->data; m->data = t; } p = p->pNext; } system("pause"); }
//按成績排序
void SortByMath() { SNode* p = g_Head; if (!p) { return; } while (p->pNext) { SNode* q = p->pNext; SNode* m = p; while(q) { if (q->data.fMath > m->data.fMath) { m = q; } q = q->pNext; } if (m != p)//不等時交換 { DATA t = p->data; p->data=m->data; m->data = t; } p = p->pNext; } system("pause"); } int SortMenu() { system("cls"); puts("\n\n\t\t1、按姓名排序:"); puts("\t\t2、按學號排序:"); puts("\t\t3、按成績排序:"); puts("\t\t0、退出排序:"); int i = 0; scanf_s("%d",&i); switch(i) { case 1: break; SortByName(); case 2: SortByNum(); break; case 3: SortByMath(); break; default: return i; } PrintAll(); return i; }
//按姓名刪除節點
int DeleteByName() { PrintAll(); char name[20]; printf("請輸入姓名:"); scanf("%s",name); SNode* p = g_Head; SNode* p1 = NULL;//記錄前一個節點 if (!p) { return 0; } //如果是頭節點要特殊處理 if(strcmp(p->data.sName,name)== 0) { g_Head = p->pNext; delete p; return 1; } while(p) { if (strcmp(p->data.sName,name)== 0) { p1->pNext=p->pNext; free(p); return 1; } p1=p; p=p->pNext; } return 0; }
//按學號刪除節點
int DeleteByNum() { PrintAll(); int iNum =0; printf("請輸入學號:"); scanf_s("%d",&iNum); SNode* p = g_Head; SNode* p1 = NULL;//記錄前一個節點 if (!p) { return 0; } //如果是頭節點要特殊處理 if(p->data.nNum== iNum) { g_Head = p->pNext; delete p; return 1; } while(p) { if (p->data.nNum== iNum) { p1->pNext=p->pNext; free(p); return 1; } p1=p; p=p->pNext; } return 0; } int DeleteMenu() { system("cls"); puts("\n\n\t\t1、按姓名刪除:"); puts("\t\t2、按學號刪除:"); puts("\t\t0、退出回主菜單:"); int i = 0,j=0; scanf_s("%d",&i); switch(i) { case 1: j = DeleteByName(); if(j>0) { printf("刪除成功!"); } else { printf("刪除失敗!"); } break; case 2: j = DeleteByNum(); if(j>0) { printf("刪除成功!"); } else { printf("刪除失敗!"); } break; default: return i; } PrintAll(); return i; }
//查找
int FindByName() { char name[20]; printf("請輸入姓名:"); scanf("%s",name); SNode* p = g_Head; while (p) { if (strcmp(p->data.sName,name)==0) { puts("學號\t姓名\t數學"); printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); return 1; } p=p->pNext; } return 0; }
//按學號查找
int FindByNum() { int iNum =0; printf("請輸入學號:"); scanf_s("%d",&iNum); SNode* p = g_Head; while (p) { if (p->data.nNum == iNum) { puts("學號\t姓名\t數學"); printf("%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); return 1; } p=p->pNext; } return 0; }
int FindMenu() { system("cls"); puts("\n\n\t\t1、按姓名查找:"); puts("\t\t2、按學號查找:"); puts("\t\t0、退出回主菜單:"); int i = 0; scanf_s("%d",&i); switch(i) { case 1: FindByName(); break; case 2: FindByNum(); break; default: return i; } system("pause"); return i; }
//按姓名修改成績
int ModifyByName() { char name[20]; float fmath =0.0; printf("請輸入姓名:"); scanf("%s",name); printf("請輸入新成績:"); scanf("%f",&fmath); SNode* p = g_Head; while (p) { if (strcmp(p->data.sName,name)==0) { printf("修改前:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); p->data.fMath=fmath; puts("學號\t姓名\t數學"); printf("修改后:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); return 1; } p=p->pNext; } return 0; } //按學號修改成績 int ModifyByNum() { float fmath =0.0; int iNum =0; printf("請輸入學號:"); scanf_s("%d",&iNum); printf("請輸入新成績:"); scanf("%f",&fmath); SNode* p = g_Head; while (p) { if (p->data.nNum == iNum) { printf("修改前:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); p->data.fMath=fmath; puts("學號\t姓名\t數學"); printf("修改后:%d\t%s\t%0.1f\n",p->data.nNum,p->data.sName,p->data.fMath); return 1; } p=p->pNext; } return 0; } //只能修改成績 int ModifyMenu() { system("cls"); puts("\n\n\t\t1、按姓名修改:"); puts("\t\t2、按學號修改:"); puts("\t\t0、退出回主菜單:"); int i = 0; scanf_s("%d",&i); switch(i) { case 1: ModifyByName(); break; case 2: ModifyByNum(); break; default: return i; } system("pause"); return i; } int Menu() { system("cls");//clear screen puts("\n\t\t1、瀏覽所有信息"); puts("\t\t2、添加信息"); puts("\t\t3、刪除信息"); puts("\t\t4、修改信息"); puts("\t\t5、查找信息"); puts("\t\t6、顏色設置"); puts("\t\t0、退出"); printf("\t\t請選擇:"); int i = 0; scanf_s("%d",&i); switch(i) { case 1: //PrintAll(); while(SortMenu()); break; case 2: while(AddMenu()) ; break; case 3: while(DeleteMenu()) ; break; case 4: while(ModifyMenu()) ; break; case 5: while(FindMenu()) ; break; case 6: break; } return i; } int main() { system("color 1f"); printf("\n\n"); printf(" \t *******************************************************************\n"); printf(" \t ****** ******\n"); printf(" \t ****** 員工工管理信息系統 ******\n"); printf(" \t ****** ******\n"); printf(" \t ****** 2018-8-5 ******\n"); printf(" \t ****** http://www.cnblogs.com/chechen/ ******\n"); printf(" \t ****** 按任意鍵繼續 ******\n"); char c = _getch(); Load(); while(Menu()) ; return 0; }

 項目效果圖:

主菜單:

瀏覽信息:

 

 

 

 

設置顏色默認的控制台前景和背景色:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM