C語言課程設(shè)計 職工信息管理系統(tǒng) 單鏈表實現(xiàn)程序源代碼
《C語言課程設(shè)計 職工信息管理系統(tǒng) 單鏈表實現(xiàn)程序源代碼》由會員分享,可在線閱讀,更多相關(guān)《C語言課程設(shè)計 職工信息管理系統(tǒng) 單鏈表實現(xiàn)程序源代碼(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、//C語言課程設(shè)計職工信息管理系統(tǒng)一單鏈表實現(xiàn) ttinclude "stdio. h" ttinclude "stdlib. h" ttinclude "string, h" int saveflag=O; /*是否需要存盤的標志變量*/ struct employee { char name[15]; char num [10] ;/* 工號 */ char sex[4]; char bm[15]; char zc [20]; int gz: }; typedef struet node { struet employee data; struet node
2、*next; }Node, *Link; //Link 1 (注意是:字母1不是數(shù)字1) void add (Link 1); void disp(Link 1) ; //查看職工所有信息 void del (Link 1); 〃刪除功能 Node* Locate(Link 1, char findmess[], char nameornumEl); void Qur (Link 1); void Tongji(Link 1); void Sort(Link 1): void Modify(Link 1); void save (Link 1): void printe(N
3、ode *p); //查詢功能 //統(tǒng)計 //排序 //修改功能 〃將單鏈表1中的數(shù)據(jù)寫入文件 〃本函數(shù)用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容*/ 〃以下4個函數(shù)用于輸出中文標題 void printstart(); void Wrong (); void Nofind (); void printc (); void menu () **********\n〃) printf("\t* *\n〃); printf(〃\t* 職工信息管理系統(tǒng)—結(jié)構(gòu)體數(shù)組實現(xiàn) *\『); printf("\t* *\『); printf("\t* [11 增加職工信息 [2
4、] 刪除職工 信息 *\n〃); printf("\t* [3] 查詢職工信息 [4] 修改職工 信息 *\n〃); printf("\t* [5] 插入職工記錄 [6] 統(tǒng)計職工 記錄 *\n〃); printf("\t* [7] 排序 [8] 保存職工 信息 *\n〃); printf("\t* [9] 顯示數(shù)據(jù) [0] 退出系統(tǒng) *\『); pri ntf ("\t * *\『); , :\ >1^ >1^ >1^ >1^ >1^ >1^ >1^ >1^ >1^
5、>1^ >1^ >1^ I I \ I **********\n〃) } //void menu菜單結(jié)束 void Disp(Link 1) //顯小單鏈表1中存儲的職工記錄,內(nèi)容為employee結(jié)構(gòu) 中定義的內(nèi)容 { int count二0; Node *p; P=l->next; // 1存儲的是單鏈表中頭結(jié)點的指針,該頭結(jié)點沒有存儲職工 信息,指針域指向的后繼結(jié)點才有職工信息 if(!p) /*p==NULL, NU11 在 stdlib 中定義為 0*/ { printf (/z\n=====>提示:沒有職工記錄可以顯示! \n〃); return; }
6、printf (zz\t\t\t\t 顯示結(jié)果\n〃); printstart () ; //打印橫線 printc (); 〃打印各學科標題 printf("\n"); while (p) //逐條輸出鏈表中存儲的職工信息 { printe(p); p=p->next; } pri nt start (); printf("\n"); } //void Disp 結(jié)束 void printstart() { printf (" \n"); } void Wrong () { printf (〃\n二==>提示:輸入錯誤! \n〃); } void
7、 Nofind () { printf C\n=====>提示:沒有找到該職工! \n〃); } void printc () /*本函數(shù)用于輸出中文*/ { printf(〃工號\t姓名性別部門職稱工資總工資平均工資\n〃); } void printe(Node *p)/*本函數(shù)用于打印鏈表中某個節(jié)點的數(shù)據(jù)內(nèi)容*/ { printf (/z%-12s%s\t%s\t%d\t%d\t%d\t %d\t %d\n", p->data. num, p->data. name, p->data. sex, p->data. bm, p->data. zc, p->dat a.
8、 gz); //Locate(1, findmess, "num"); /*該函數(shù)用于定位連表中符合要求的結(jié)點,并返回該指針*/ Node* Locate(Link 1, char findmess[], char zcornum[]) { Node *r; if (strcmp (zcornum, ^num^) ==0) /* 按工號查詢 */ { r=l~>next; while (r!=NULL) { if (strcmp (i'-〉data, num, findmess) ==0) /*若找到 findmess 值的工 號*/ return r; r=r~>n
9、ext; } } else if (strcmp (zcornum,,,zc,,)==0) /* 按職稱查詢 */ { r=l~>next; while (r!=NULL) { if (strcmp (r~>data. zc, findmess) ==0) /*若找到 findmess 值的職 工職稱*/ return r; r=r~>next; } } return 0; /*若未找到,返回一個空指針*/ } //add()函數(shù)中,無節(jié)點時,r指向list頭,有節(jié)點時,r指向末尾節(jié)點 void Add (Link 1) /* 增加職工 */ { Node
10、 *p,*r,*s; /*實現(xiàn)添加操作的臨時的結(jié)構(gòu)體指針變量*/ char num[10]; int flag=0; r=l; s=l->next: //鏈表沒有節(jié)點時,s=null;/鏈表有節(jié)點時,指向第一個職工 節(jié)點 while(r->next!=NULL) //如果存在后繼結(jié)點時,r指針后移一個 r=r->next; /*將指針移至于鏈表最末尾,準備添加記錄*/ while (1) printf (〃請你輸入工號(以'0’返回上一級菜單:)〃); scanfnum); if (strcmp (num,,,0,,)==0) 〃輸入'O',跳出 while (1), B|J 跳
11、出 add ()函 數(shù) break; s=l->next; //作用?每次從第一個節(jié)點開始找,看num是否重復。 while (s) //工號重復時,返回主菜單 { if(strcmp(s~>data. num, num)==O) { printf (〃===>提示:工號為'%s'的職工己經(jīng)存在,若要修改請 你選擇'4修改’! \n", num); flag=l; //break; return ; } s=s~>next; } //while(s) p= (Node *)malloc (sizeof (Node)) ; //生成沒賦值的新節(jié)點 p strcpy (p
12、->data. num, num); printf ("請你輸入姓名:"); scanf p->data. name); get char (); printf ("請你輸入性別:"); scanf (,z%sz,, p->data. sex); get char (); printf (〃請你輸入職工所在部門:〃); scanf ("滋d", &p->data? bm); get char (); printf (/z請你輸入職工職稱:〃); scanf ("滋d", &p->data? zc); get char (); printf (〃請你輸入職工工資:〃);
13、 scanf ("滋d", &p->data? gz); get char (); /*信息輸入已經(jīng)完成*/ p->next二NULL; /*表明這是鏈表的尾部結(jié)點*/ r=P; saveflag=l; } //while(1) } //void Add增加結(jié)束 void Del (Link 1) /* 刪除 */ { int sei; Node *p, *r; /*實現(xiàn)刪除操作的臨時的結(jié)構(gòu)體指釗?變量*/ char findmess[20]; 辻(!l->next) 〃當list無后繼結(jié)點時,提示和結(jié)束返回del() { printf (〃\n二二二二二〉提示
14、:沒有記錄可以刪除! \n〃); return; } printf (〃\n二二二二二>1 按工號刪除\n二二二二二>2 按姓名刪除\n〃); scanf&sei); 辻(sel==l) //按工號刪除 { printf (〃請你輸入要刪除的工號:"); scanffindmess); p二Locate(l,findmess, "num"); if(P) { r=l; while(r->next!二p) r=r->next; //從第一個結(jié)點找起,直到發(fā)現(xiàn)r~>next=p,是待 刪除結(jié)點,跳出循環(huán) r~>next二p->next; //r r~>next (p)
15、 p->next free(p); printf (〃\n二==>提示:該職工己經(jīng)成功刪除! \n〃); saveflag二1; } else Nofind () ; //顯示一句話 } //if (sel==l) else辻(sei二二2) //按姓名刪除 printf (〃請你輸入要刪除的姓名:〃); scanffindmess); 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
16、free(p); printf (z/\n=====>提示:該職工已經(jīng)成功刪除! \n〃); saveflag=l; } else Nofind (); } //if (sel=2) else Wrong() ; //顯示輸入錯誤的話 } //void Del刪除結(jié)束 void Qur (Link 1) //查詢功能 { int sei; char findmess[20]: Node *p; //實現(xiàn)查詢操作的臨時的結(jié)構(gòu)體指針變量 if(!l->next) { printf (〃\n二==>提示:沒有資料可以查詢! \n〃); return; } prin
17、tf (,,\n=====>l 按工號查找\n=====>2 按職稱查找\n〃); scanf&sei); if(sel==l)/* 工號 */ { printf (“請你輸入要查找的工號:"); scanffindmess); p二Locate(l, findmess, "num"); if(P) { printf C\t\t\t\t 查找結(jié)果\n"); printstart () : //打印橫線 printc (); //打印各學科標題 printe (p) : //打印p結(jié)點各個數(shù)據(jù)成員的值 printstart () ; //打印橫線 } else No
18、find (); } //辻(sel==l) else if (sel==2) /* 職稱 */ { printf (〃請你輸入要查找的職稱:"); scanffindmess); p二Locate(l, findmess, "zc"); if(P) { printf C\t\t\t\t 查找結(jié)果\n"); prints tart (); printc (); printe (p); prints tart (); } else Nofind (); } else Wrong (); } //void Qur查詢結(jié)束 void Modify (Link
19、 1) //修改功能 { Node *p; char findmess[20]: if (!l~>next) { printf (〃\n二==>提示:沒有資料可以修改! \n〃); return; } printf ("請你輸入要修改的職工工號:〃); scanf findmess); p二Locate(l, findmess, "num"); 辻(p) { printf ("請你輸入新工號(原來是蜒):",p->data. num); scanf p->data. num); printf (”請你輸入新姓夕i (原來是%s) :", p->data. name);
20、 scanf (,,%s,,> p->data. name); getchar (); printf ("請你輸入新性別(原來是蜒):”,p->data. sex); scanf (,z%sz,, p->data? sex); getchar (); printf ("請你輸入新的部門(原來是%s) : p->data. bm); scanf (,z%d,z, &p->data? bm); printf C請你輸入新的職稱(原來是%s) :", p-〉data, zc); scanf (,z%d,z, &p->data? zc); getchar (); printf ("請你輸
21、入新的工資(原來是%d) : ”, p->data. gz); scanf (,z%d,z, &p->data? gz); printf (z,\n=====>提示:資料修改成功! \n"); //shoudsave=l; } else Nofind () ; //if (p)結(jié)束 } //void Modify (Link 1) //修改功能結(jié)束 //插入記錄:按工號查詢到要插入的節(jié)點的位置,然后在該工號之后插入一個新 節(jié)點。 void Insert(Link 1) { Node *s, *r, *p; /*p指向插入位置,p指新插入記錄節(jié)點*/ char ch, ne
22、w_num[10], old_num[10]; //old_num[]?存插入點囲之前的工號,new_num[]保存輸入的新記錄 的工號 int flag=0; s=l~>next; system("cis"); Disp(l); while (1) { //stringinput(s,10, "please input insert location after the Number; printf(/z請你輸入己存在的工號(以'O'返回上一級菜單:)〃); scanf (,,%s/z, old_num); if (strcmp (old_num, "0")二二 0) //
23、輸入'O',跳出 while (1),即跳出 Insert ()函數(shù) return; s=l->next; //作用?每次從第一個節(jié)點開始找 flag=O; while (s) /*查詢該工號是否存在,flag=l表示該工號存在*/ { if(strcmp(s~>data. num, old_num)==0) { - flag=l; break; } s=s~>next; } if(flag==l) break; /*若工號存在,則進行插入之前的新記錄的輸入操作*/ else { getchar (); printf (,,\n=====>The numbe
24、r %s is not existing, try again? (y/n):", old_num); scanf &ch); if (ch 二二'y,| | ch 二二'Y') {continue;} else {return;} 〃回主菜單 } }//while(1) /*以下新記錄的插入新節(jié)點,工號不能跟已存在的工號相同,操作與Add() 相同*/ printf(〃請你輸入待插入的工號(以‘0’返回上一級菜單:)〃); scanf (,z%sA new_num); if (strcmp (new_num, "0")=0) //輸入'O',跳出 while (1),即跳
25、出 add () 函數(shù) 一 return; s=l->next; //作用?每次從第一個節(jié)點開始找,看num是否重復。 while(s) //工號重復時,返回主菜單 { if (strcmp (s~>data. num, new_num) ==0) { _ printf ("=====>提示:工號為'%s'的職工己經(jīng)存在 ! \n", new_num); flag=l; return ; } s二s->next; } //while(s) p=(Node *)malloc(sizeof(Node)); if(!p) { printf(z,\n allocate
26、memory failure “); /*如沒有申請到,打印 提不信息*/ return ; /*返回主界面*/ } strcpy(p->data? num, new_num); printf (“請你輸入姓名: scanfp->data. name); getchar (); printf (“請你輸入性別:"); scanfp->data. sex); getchar (); printf (”請你輸入部門:"); scanf&p->data? bm); getchar (); printf (“請你輸入職稱:"); scanf&p->data? zc); getc
27、har (); printf(〃請你輸入工資:〃); scanf&p->data? gz); getchar (); //信息輸入己經(jīng)完成 p->next二NULL; /*表明這是鏈表的尾部結(jié)點*/ saveflag二1; /*在main()有對該全局變量的判斷,若為1,則進行存盤操 作*/ /*將指針賦值給r,因為1中的頭節(jié)點的下一個節(jié)點才實際保存著學生的 記錄*/ r二1一>next; while (1) { if (strcmp (r~>data. num, old_num) ==0) /*在鏈表中插入一個節(jié)點*/ { _ p->next=r->next; r
28、一>next二p; break; } r二r一>next; }// whiled) , r作為查詢指針,依次從第一個節(jié)點找起,找到后跳 出while (1)循環(huán) Disp(l); printf("\n\n"); // getchar (); void Tongji (Link 1) //統(tǒng)計 { Node *max, *min;/*用于指向工資最高的節(jié)點*/ Node *t二1->next; if(!t) { system(〃cls"); printf("\n二二二二二〉Not employee record!\n"); getchar (); return;
29、 } system(〃cls〃); Disp(l); max=min=t; while(t) if (t->data. gz>二max-〉data. gz) max=t; if (t->data. gz<=min->data. gz) min=t; t二t~>next; printf ("最高工資為:%d\n", max); printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n", t-〉data. num, t->data. name, t~>dat a. sex, t~>data. bm, t->data. zc, t->data. gz); print
30、f C最低工資為:%d\n", min); printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n", t-〉data. num, t->data. name, t~>dat a. sex, t~>data. bm, t->data. zc, t->data. gz); } } void Sort (Link 1) //排序 { Link 11: Node *p, *i\r, *s; int i=0; 辻(l->next==NULL) { system(,zcls/z); printf("\n二二二二二〉Not employee record!\n");
31、 getchar (); return ; } 11= (Node*)malloc (sizeof (Node)) ; /*用于創(chuàng)建新的節(jié)點*/ 辻(!11) { printf(z,\n allocate memory failure “); /*如沒有申請到,打印 提不信息*/ return ; /*返回主界面*/ } 11-〉next二NULL; system("cis"); Disp(l) ; /*顯示排序前的所有職工記錄*/ p二1一〉next; while(p) /*p!二NULL*/ { s=(Node*)malloc (sizeof (Node))
32、 ; /*新建節(jié)點用于保存從原鏈表中 取出的節(jié)點信息*/ if(!s) /*s二二NULL*/ printf(z/\n allocate memory failure “); /*如沒有申請到, 打印提示信息*/ return ; /*返回主界面*/ } s->data=p->data; /*填數(shù)據(jù)域*/ s->next=NULL; /* 指針域為空 */ rr=ll; /紅r鏈表于存儲插入單個節(jié)點后保持排序的鏈表,11是這個鏈表的 頭指針,每次從頭開始查找插入位置*/ while(rr~>next!二NULL && rr~>next->data. gz>=p->data. g
33、z) {rr=rr->next;} /*指針移至總分比p所指的節(jié)點的總分小的節(jié)點位 置*/ if(rr->next==NULL)/*若新鏈表11中的所有節(jié)點的總分值都比 p->data.gz大時,就將p所指節(jié)點加入鏈表尾部*/ rr~>next=s; else /*否則將該節(jié)點插入至第一個總分字段比它小的節(jié)點的前面*/ { s->next二rr->next; rr~>next=s; } p=p->next; /*原鏈表中的指針下移一個節(jié)點*/ } l->next=ll->next; All中存儲是的已排序的鏈表的頭指針*/ Disp(l); saveflag=l; pri
34、ntf ("\n =====>sort complete! \n,z); } void Save(Link 1) { FILE* fp; Node *p; //實現(xiàn)保存操作的臨時的結(jié)構(gòu)體指針變量 int flag二1, count二0; fp二fopen("employee, txt", "wb"); 辻(fp==NULL) { printf (〃\n二==>提示:重新打開文件時發(fā)生錯誤! \n〃); return; p=l->next; //p指向第一個記錄結(jié)點 while(p) { if (fwrite (p, sizeof (Node), 1, fp)==l
35、) //將第一個記錄結(jié)點值寫 入文件 { p=p->next; //依次寫入第二個結(jié)點的 值, count++; //文件的記錄數(shù)+1 } else { flag=0; break; } } //while(p) 辻(count>0) { Printf(/Z\n=====>提示:文件保存成功.(有%d條記錄己經(jīng)保 存.)\n", count); saveflag=0; } else { system("cls"); printf(/z保存文件失敗,’O'條記錄被保存! \n〃); } fclose(fp); } // void Save 結(jié)束 vo
36、id main () { Link list: /*定義鏈表*/ // struct node *list; FILE *fp; /*文件指針*/ int choose; /*保存選擇結(jié)果變量*/ char ch; /*保存(y, Y, n, N)*/ int count=0; /*保存文件中的記錄條數(shù)(或結(jié)點個數(shù))*/ struct node *p, *r; /*定義記錄指針變量*/ printf (,z\t\t\t\t 職工信息管理系統(tǒng)\n\t\t\t\t\n"); list=(struet node*)malloc(sizeof(struet node)): if (!l
37、ist) { printf(z,\n allocate memory failure “); /*如沒有申請到,打印 提不信息*/ return ; /*返回主界面*/ } list->next=NULL; r=list; fp二fopen("employee, txt", "rb"); if(fp==NULL) { printf(/z\n=====>提示:文件還不存在,是否創(chuàng)建?(y/n)\n〃); scanf &ch); if (ch==,y,| | ch==,Y,) fp二fopen("employee . txt","ab+"); else exit (0)
38、; } // if(fp二二NULL) printf (,z\n=====>提示:文件己經(jīng)打開,正在導入記錄 \n〃); while(!feof(fp)) //沒有到文件尾時,循環(huán) { p二(struet node*)malloc(sizeof(struet node)); if(!p) { printf (" memory malloc failure! \n,z) ; /*沒有申請成功*/ exit (0) ; /*退出*/ } if (fread (p, sizeof (struct node), 1, fp)) /* 讀文件的己有內(nèi)容放 入結(jié)點中*/ p->ne
39、xt二NULL; r~>next二p; r二p; /*將該結(jié)點掛入鏈表中,r指向最后的節(jié)點*/ count++; } } //while(!feof(fp)) fclose (fp) : /* 關(guān)閉文件 */ printf ("\n=二二二〉提示:記錄導入完畢,共導入%d條記錄?\n,z, count); while (1) { menu (); printf (/z\t\t====>請選擇:”); scanf (,z%d,z, &choose); if (choose二二0) { if (saveflag==l) { get char (); printf (/
40、z\n=====>提示:資料己經(jīng)改動,是否將改動保存到文 件中(y/n)?\nO ; scanf &ch); if (ch 二二'y,| | ch 二二'Y') Save (list); } //辻 printf (z/\n=====>提示:你己經(jīng)退出系統(tǒng),再見!\n〃); break; }//if switch(choose) { case 1:Add(list); break; /*增加職工記錄*/ case 2: Del(list); break;/*刪除職工記錄*/ case 3: Qur(list); break;/*查詢職工記錄*/ case 4:
41、 Modify(list); break;/*修改職工記錄*/ case 5: Insert(list); break;/*插入職工記錄*/ case 6: Tongji (list); break; /*統(tǒng)計職工記錄*/ case 7: Sort (list); break;/*排序職工記錄*/ case 8: Save(list); break;/*保存職工記錄*/ case 9: system(〃cls〃); Disp (list); break; /*顯示職工記錄*/ default: Wrong (); getchar (); break; } //switch(choose) }//while(l) } //main() /* */
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇教版五上《小數(shù)乘整數(shù)》ppt課件
- 蘇教版一年級數(shù)學上冊《數(shù)一數(shù)》ppt課件
- 江南1優(yōu)秀課件
- 提高印字質(zhì)量課件
- 服務(wù)分銷策略課件
- 數(shù)學必修蘇教版互斥事件課件3(共32張PPT)
- 第三章要素費用的核算PPT優(yōu)秀資料
- 元素的質(zhì)量分數(shù)計算答案
- 圖形的欣賞與設(shè)計
- 八年級下期Uuit10SectionA課件
- 部編七年級語文下冊4孫權(quán)勸學課件
- 部編一年級語文下冊端午粽課件
- 超市防損的技能課件
- 表彰班會教學課件教學課件
- 第17講中考數(shù)學專題復習 函數(shù)的綜合應(yīng)用中考數(shù)學專題復習課件課件各版通用