C語言鏈表員工信息管理系統(tǒng)實驗報告冊_第1頁
C語言鏈表員工信息管理系統(tǒng)實驗報告冊_第2頁
C語言鏈表員工信息管理系統(tǒng)實驗報告冊_第3頁
C語言鏈表員工信息管理系統(tǒng)實驗報告冊_第4頁
C語言鏈表員工信息管理系統(tǒng)實驗報告冊_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、電子科技人學成都學院 實驗報告冊 課程名稱:C 語言課程設(shè)計 姓名:蔣明軒 學號: 院系:微電子技術(shù)系 專 業(yè):嵌入式系統(tǒng)工程 教師:孫軻 2016年5月30日 第1章設(shè)計目的設(shè)計整體框架 1.1設(shè)計任務(wù) 現(xiàn)對員工信息的管理,包括姓名,工號,性別,測評成績,以及等級,可 以實現(xiàn)對于員工信息的輸入,插入,刪除,排序,修改,統(tǒng)計,查詢,保存。 1.2設(shè)計要求 員工信息的輸入,插入,刪除,排序,修改,統(tǒng)計,查詢,保存等 1. 3設(shè)計意義 此程序用于新建及管理員工信息,其包括員工工號,姓名,性別,以及員 工的考核成績,在程序中根據(jù)提示信息輸入相關(guān)內(nèi)容,輸入完成后,可對其 輸入的內(nèi)容進行修改,刪除,追加

2、,統(tǒng)計等操作,操作完成后保存 文件,文件 在下一次啟動程序時將進行自動讀取信息內(nèi)容。 第2章設(shè)計方案 2. 1軟件工作 主函數(shù)中幵始讀取保存的TXT文件,若不存在則建立該文件,根據(jù)的 選項,循環(huán)調(diào)用各個功能模塊,直到選擇退出時,將標識符改變,退出循 環(huán), 退出該程序。 2.2模塊流程圖 第3章實現(xiàn)功能 3. 1實現(xiàn)功能描述 主函數(shù):檢測是否有對應(yīng)的文件,若存在則打開該文件,否則則建立該文 件,設(shè)置標識符循環(huán)功能模塊,根據(jù)輸入選項選擇需要使用的功 厶匕 能; 增加員工信息:根據(jù)工號判斷是否需要動態(tài)分配存儲空間,而后輸入員工信 息; 查詢員工信息:在鏈表節(jié)點中查找對應(yīng)信息的節(jié)點,并打印節(jié)點信息;刪

3、除員 工信息:在鏈表中查找對應(yīng)信息節(jié)點,查找到后將節(jié)點指向更改后,釋放對 應(yīng)節(jié)點信息; 修改員工信息:查找對應(yīng)信息,然后重新輸入該節(jié)點信息;插入員工信息: 打印員工信息,并選擇需要插入的節(jié)點,鏈表中指向該節(jié) 點后的指針,分配一 個新的空間,輸入信息,并更改指針指向; 統(tǒng)計員工信息:統(tǒng)計員工中各個等級的員工個數(shù),并打??; 排序:根據(jù)員工分數(shù),降序排列員工信息,并打??; 保存:利用指針函數(shù)保存鏈表中的信息; 3.2模塊功能描述增加員工信息:根據(jù)工號判斷是否需要動態(tài)分配存儲空間, 而后輸入員工信息;查詢員工信息:在鏈表節(jié)點中查找對應(yīng)信息的節(jié)點,并打 印節(jié)點信息;刪除員工信息:在鏈表中查找對應(yīng)信息節(jié)點

4、,查找到后將節(jié)點 指向更改后,釋放對應(yīng)節(jié)點信息; 修改員工信息:查找對應(yīng)信息,然后重新輸入該節(jié)點信息;插入員工信息:打 印員工信息,并選擇需要插入的節(jié)點,鏈表中指向該節(jié) 點后的指針,分配一個新的空間,輸入信息,并更改指針 指向; 統(tǒng)計員工信息:統(tǒng)計員工中各個等級的員工個數(shù),并打?。?排序:根據(jù)員工分數(shù),降序排列員工信息,并打印;保存:利用指針函數(shù)保存 鏈表中的信息;第4章調(diào)試與實現(xiàn) 4.1調(diào)試中遇到的重點和難點在使用鏈表時對于鏈表節(jié)點的指向不清,操作地址 混淆 4.2解決辦法 利用畫圖的方法,明確對指針指向的問題 4.3實現(xiàn)展示 顯示員工信息 主程序顯示 查詢 刪除 統(tǒng)計 第5章總結(jié) 通過此次

5、實驗,讓我認識到了自身能力的不足,也發(fā)現(xiàn)了平時一些不易發(fā) 現(xiàn)的小毛病,讓我意識到了程序中,任何一個小的細節(jié),將會導致的大問題, 比如在此次程序的編寫中,一個微不足道的取地址符將會導致內(nèi)存的崩潰和輸 出內(nèi)容的錯誤,使我養(yǎng)成了檢查代碼的習慣;此次程序中,我使用的是鏈表, 在學習數(shù)據(jù)結(jié)構(gòu)理論知識時,覺得鏈表使用應(yīng)該是簡單,方便,快捷的,但通 過此次實踐證明,理論與實際的巨大差距,不但對指 針的認識更加具體,也讓我磨煉了意志力,學會了責任與擔當,挑戰(zhàn)了個 人能 力,認識自身缺點。 第6章代碼清單 include windows h ttinclude stdio. h ttinclude stdlib

6、. h ttinclude string h int sa.veflag=O; /是否需耍存盤的標志變量 struct worker char name10; char num10 :/ 工號 char sex 5: int sorce5: char dj10; ; typedef struct node ( struct worker data; struct node *next; Node, *Link; /Link 1(注意是:字母1不是數(shù)字1) void add(Link 1); void disp(Link 1): / 查看員工所有信息 void del(Link 1) : / 刪

7、除功能 Node* Locate(Link 1,char findmess, char nameornum): void serch (Link 1);/ 查詢功能 void Tongji(Link 1) : / 統(tǒng)計 void Sort (Link 1) ; / 排序 void Change(Link 1) ; / 修改功能 void save(Link 1); / void printe(Node *p); / 將鏈表中的數(shù)據(jù)寫入文件 本函數(shù)用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容 /以下4個函數(shù)用于輸岀中文標題 void printstart (); void Wrong (); void No

8、find(); void printc (); void Show_Window() ( system(/zcolor F4); Yw 7* 丫 T Tw TwT wT* Tw 丫丫Tw T T* T *Yw ? *T *T Yw丫丫next; ) printstart (); printf(rT); /void Disp 結(jié)束 void printstart () printf(“ ); void Wrong() printf Cn 輸入錯誤!n); ) void Nofind() printfCn沒有找到該員工!n); ) void printc () printf Ct工號t姓名t性別t

9、成績t等級n); ) void printe(Node *p)/用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容 printf (z/t%st%st%st%dt%stn/z, p-data num, p-data name, p-data sex, *p-data sorce, p-data. dj); ) /用于定位連表中符合要求的結(jié)點,并返回該指針 Node* Locate (Link 1, char findmess, char gh) if (strcmp (gh, num) =0) / 按工號查詢 ( r=l-next; wh訂e(r!二NULL) if (strcmp (r-da.ta. num,

10、 findmess) =0) / 若找 到 findmess 值的工 號 return r; r=r-next; return 0; /若未找到,返回一個空指針 ) /add()函數(shù)中,無節(jié)點時,r指向list頭,有節(jié)點時,r指向末尾節(jié)點 void Add (Link 1) /增加員工 Node *p,*r,*s; /實現(xiàn)添加操作的臨時的結(jié)構(gòu)體指針變量 char num10; int flag=0; r=l; s=l-next; /鏈表沒有節(jié)點時,s二null;/鏈表有節(jié)點時,指向第一個員 工節(jié)點 wh訂e(r-next!=NULL) /如果存在后繼結(jié)點時,r指針后移一個 r=r-next;

11、/將指針移至于鏈表最末尾,準備添加記錄 while (1) ( printfC請輸入工號(以0返回上一級菜單):); scanf(s,num); if (strcmp(num,,/0,)=0) / 輸 入O,跳 出 while (1),即跳出 add() 函數(shù) break; s=l- next; /每次從第一個節(jié)點幵始找,看num是否重復。 wh訂e(s) /工號重復時,返回主菜單 if (strcmp (s-da.ta num, num) =0) * printf(z,n提示:工號為s的員工已經(jīng)存在,若要修改請 你選擇,4修改J ! n/z, num); flag=l; / return ;

12、 s=s-next; / p= (Node *)malloc(sizeof (Node) : / 生成沒賦值的新節(jié)點 p strcpy (p-data. num, num); printf (請輸入姓名:); scanf (%s,p-data name); getchar (); printf C請輸入性別 scanf (%s,p-data sex); getchar (); printf (請輸入員工成績:); scanf (%d, /getchar (); if (*p-data sorce data. sorce = 90) strcpy(p-data dj, 優(yōu)秀); else if

13、(*p-data. sorcedata. sorce = 80) strcpy(p-data dj, 良好); else if (*p-data. sorcedata. sorce = 70) strcpy(p-data dj, 中等); else if (*p-data. sorcedata. sorce= 60) else strcpy(p-data. dj, if (*p-data. sorcedata. sorce=NULL) 不合格); strcpy(p-data dj, /信息輸入已經(jīng)完成 p-next二NULL; /表明這是鏈表的尾部結(jié)點r-next=p; /將新建的結(jié) 點加入鏈

14、表尾部中r=p; saveflag=l; printc (); printe(p); Sleep (100); /wh訂e(l) /void Add增加結(jié)束 void Del (Link 1) / 刪除 int sei; Node *p, *r; /實現(xiàn)刪除操作的臨時的結(jié)構(gòu)體指針變量char findmess20 del () if(!l-next) /當list無后繼結(jié)點時,提示和結(jié)束返回next!=p) r=r-next; /從第一個結(jié)點找起,直到發(fā)現(xiàn)r-next=p,待刪 除結(jié)點,跳出循環(huán) r-next=p-next; /r r-next (p) p-next free (p): pri

15、ntf(,znt提示:該員工已經(jīng)成功刪除!n); saveflag=l: ) else Nofind() ; /顯示一句話 /if(sel=l) else if(sel=2) / 按姓名刪除 printf (請輸入要刪除的姓名:“);scanf (%s,findmess); p=Locate(l, findmess, name); if(p) r=l; while (r-next!=p) r=r-next; r-next=p-next; /r r-next (p) p-next free (p): printfCnt提示:該員工已經(jīng)成功刪除!); saveflag=l; ) else Nofi

16、nd (); /if(sel=2) else Wrong() : /顯示輸入錯誤的話 /void Del刪除結(jié)束 void serch(Link 1) / 查詢功能 int sei; char findmess 20; Node *p; /實現(xiàn)查詢操作的臨時的結(jié)構(gòu)體指針變量 辻(!1-next) ( printf(zznt提示:沒有數(shù)據(jù)可以查詢!n); return; printf C 請輸入要查找的工號:);scanf (s,findmess); p二Located, findmess, nunT); if(p) printf (z/tttt 查找結(jié)果n); printstart () ;

17、/ 打印橫線 printc (); printe(p); / 打印p結(jié)點各個數(shù)據(jù)成員的值 printstart () ; / 打印橫線 else Nofind (); void Change (Link 1) /修改功能 Node *p; char findmess20: 辻(!l-next) printfCnt提示:沒有資料可以修改!n); return; ) printf(請輸入耍修改的員工工號:“); scanf(s: findmess); p=Locate (1, findmess, nunT); if(p) printf C請輸入新工號:“); scanf(s,p-data num)

18、; printf C請輸入新姓名; scanf(s,p-data name); getchar (); printf (請輸入新性別:); scanf (s,p-da.ta sex); getchar (); printf C請輸入新的員工分數(shù):); scanf (d, =90) if (*p-data sorce data sorce else else else strcpy (p-da.ta. dj, if (*p-data. sorceda.ta. dj, if (*p-data. sorcedata. dj, if (*p-data. sorcedata sorce = 良好); p

19、rintf Cnt提示:數(shù)據(jù)修改成功!n); /shoudsave=l; else Nofind() : /if (p)結(jié)束 /void Change (Link 1) / 修改功能結(jié)束 /插入記錄:按工號查詢到要插入的節(jié)點的位置,然后在該工號之后插入一個 新節(jié)點。 void Insert(Link 1) Node *s, *r, *p; /p指向插入位置,p指新插入記錄節(jié)點 char ch, new_num10, old_num10; /old_num保存插入點位置之前的工號,new_num保存輸入的新 記錄 的工號 int flag=O; s=l-next; system(cls); Di

20、sp(l); while (1) printf(請你輸入已存在的工號(以O(shè)返回上一級菜單:); scanf(s,o1d_num); if(strcmp(old_num, 0)=0) / 輸入O,跳出 while(1),艮卩跳出 Insert ()函數(shù) return; s=l-next; /作用?每次從第一個節(jié)點開始找 flag=O; wh訂e(s) /查詢該工號是否存在,flag=l表示該工號存在 if (strcmp(s-data num, old_num) =0) flag=l; break; s=s-next; if (flag=l) break; /若工號存在,則進行插入之前的新記錄的

21、輸入操 作 else getchar (); printf (/zn該工號不存在,時候再次嘗試? (y/n):,old_num); scanf(%c, if (ch=,y,| ch二二Y,) continue; else return; /回主菜單 /wh 訂 e(l) /以下新記錄的插入新節(jié)點,工號不能跟已存在的工號相同,操作 與Add()相同 printf(請你輸入待插入的工號(以0返回上一級菜單:); scanf(%s, new_num); if (strcmp(new_num, 0)=0) / 輸入O,跳岀 whil e (1),即跳出 add ()函數(shù) return; s=l-nex

22、t; /作用?每次從第一個節(jié)點幵始找,看nuni是否重復。 wh訂e(s) /工號重復時,返回主菜單 if(strcmp(sdata num, new_num)=0) printfC提示:工號為,%s,的員工已經(jīng)存在 !n,new_num); flag=l; return ; s=snext; /wh訂e(s) p二(Node *)malloc(sizeof(Node); if(!p) printf(z,nt 錯誤!不能申請所需的內(nèi)存!); /如沒有申請 到,打印提示信息 return ;/返回主界面 strcpy (p-data. num, new_num); printf C請輸入姓名;

23、scanf(s,p-data. name); getchar (); printf C請輸入性別:); scanf(s,p-data sex); getchar (); printf C請輸入分數(shù); scanf(d, /信息輸入已經(jīng)完成 if (*pdata. sorce data. sorce = 90) strcpy (p-data. dj, 優(yōu)秀 “); else if (*p-data. sorcedata. sorce = 80) strcpy (p-data. dj, 良好 “); else if (*p-data. sorce= 70) strcpy (p-data. dj, 中

24、等 “); else if (*p-data sorcedata sorce= 60) strcpy (p-data dj, 合格 “); else if (*pdata sorcedata sorce二二NULL) strcpy (p-data. dj,不合格“); p-next二NULL; /表明這是鏈表的尾部結(jié)點 saveflag二1; /在mainO有對該全局變量的判斷,若為 存盤操作 /將指針賦值給r,因為1中的頭節(jié)點的下一個節(jié)點才實際保存著學生 的記錄 1=1-next; while (1) if (strcmp (r-data num, old_num)=0) /在鏈表中插入一個

25、 節(jié)點 p-next=rnext: r-next=p; break; r=rnext; / whiled) , r作為查詢指針,依次從第一個節(jié)點找起,找到后跳出 wh訂e(l)循環(huán) Disp(l); printf(nn); / getchar (); ) void Tongji (Link 1) / 統(tǒng)計 Node *max, *min; Node *t=l-next; 辻(!“ ( systemCzclsz,); printf Cnt 無員工記錄! n); getchar (); return; system(cls); Sleep (100); Disp(l); max=min=t; wh

26、ile(t) ( if(*t-data. sorce*max-data sorce) ma.x=t; if(*t-data. sorcedata sorce) min=t; t=t-next; printf C最高分數(shù)為 printe(max); printf C最低分數(shù)為:); printe(min); void Sort (Link 1) / 排序 Link 11;/ 鏈 Node *p, *r, *s;/ 節(jié)點 int i=0; if (l-next=NULL) system(cls); printf Cn 無員工記錄! n); getchar (); return ; else 11=

27、 (Node*)malloc (sizeof (Node) ; /用于創(chuàng)建新的節(jié)點 if (ill) printf(z,nt錯誤!不能申請所需的內(nèi)存!); /如沒有申請 到,打印提示信息 return ; / 返回主界面 ll-next=NULL; system(cls); Disp(l) ; /顯示排序前的所有員工記錄 p=l-next; wh訂e(p) /p!二NULL s二(Node*)malloc(sizeof (Node) ; /新建節(jié)點用于保存從原 鏈表中取 出的節(jié)點信息 if(!s) /=NULL printf(/znt錯誤!不能申請所需的內(nèi)存!); /如沒有申 請到,打印提示信

28、息 return ; /返回主界面 s-data=p-data; / 填數(shù)據(jù)域 s-next二NULL; /指針域為空 r=ll; /r鏈表于存儲插入單個節(jié)點后保持排序的鏈表,11是這個鏈表的 頭指針,每次從頭開始查找插入位置 while(r-next!=NULL 反 /指針移至分數(shù)比p所指的節(jié)點的分數(shù)小的節(jié)點 位置 if(r-next=NULL)/若新鏈表11中的所有節(jié)點的分數(shù)都比 p-data. sorce大時,就將p所指節(jié)點加入鏈表尾部 r-next=s; else /否則將該節(jié)點插入至第一個分數(shù)字段比它小的節(jié)點的 前面 s-next=r-next; r-next二s; p=p-next

29、; /原鏈表中的指針下移一個節(jié)點 l-next=ll-next; /II中存儲是的已排序的鏈表的頭指針 Disp(l); saveflag=l; printf (z/nt 排序完成!n); void Save (Link 1) FILE* fp; int flag二1,count=0; fp二fopen (worker txt,w+); if (fp=NULL) printf(z,nt提示:重新打開文件時發(fā)生錯誤!n); return; p=l-next; /p指向第一個記錄結(jié)點 while (p) if (fwrite (p, sizeof (Node), 1, fp) =1) / 將第一個

30、記錄結(jié)點 值寫入文件 fprintf (fp, n); p=p-next; / 依次寫入第二個結(jié)點 的值, count+; / 文件的記錄數(shù)+1 else flag=0; break; /wh訂e(p) if (count0) ( printf C 提示:文件保存成功(有d條記錄已經(jīng)保 n 存.)n,cou nt); saveflag=O; else system(cls); printfC保存文件失敗,O條記錄被保存! n); 5 fclose(fp); int mainO Link list; / FILE *fp; / int choose; / char ch; / / void Sa

31、ve 結(jié)束 定義鏈表 / struct node *list; 文件指針 保存選擇結(jié)果變量 保存(y, Y, n, N) struct node *p,*r; /定義記錄指針變量 system(,zcolor 7d); printf(/ztttt員工信息管理系統(tǒng) nttttnz/); Sleep (1000); list=(struct node*)malloc(sizeof(struct node): if (!list) printf(z,nt錯誤!不能申請所需的內(nèi)存?。?/如沒有申請 到,打印提示信息 return 0; /返回主界面 list-next=NULL; r=list; fp二fopen (worker txt,rw+); if (fp=NULL) printf (z,nt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論