📚 知識家圖書館 奇摩知識+ 紀念館

C語言指標的單向串列結構儲存(緊急)

發問者 ~我速陳小煥~ (Lv.1) ・2008 年 3 月 31 日 ・程式設計

可輸入學號、姓名、作業成績(佔15%)、平常成績(佔15%)、期中成績(佔30%)、期末成績(佔40%),經過計算後,並列印出學號、姓名、作業成績(乘上0.15後)、平常成績(乘上0.15後)、期中成績(乘上0.3後)、期末成績(乘上0.4後)與計算過後的總成績。兼具加入學生資料、刪除學生資料。(以指標的單向串列結構儲存)。 有人可以幫我用C語言指標的單向串列結構儲存寫出上面的題目嗎~很緊急~謝謝

1 則回答

最佳解答
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _node { char id[20]; char name[20]; double homework; double general; double midterm; double finalterm; double sum; struct _node *next; }node; node *pnode; int add() { char id[20], name[20]; double homework,general,midterm,finalterm,sum; node *person,*t; printf("請輸入學號: "); scanf("%s",&id); printf("請輸入姓名: "); scanf("%s",&name); printf("請輸入作業成績 平均成績 期中成績 期末成績: "); scanf("%lf %lf %lf %lf",&homework,&general,&midterm,&finalterm); sum = homework*0.15+general*0.15+midterm*0.3+finalterm*0.4; person = (node *)malloc(sizeof(node)); strcpy(person->id,id); strcpy(person->name,name); person->homework = homework; person->general = general; person->midterm = midterm; person->finalterm = finalterm; person->sum = sum; person->next = NULL; if(pnode == NULL) { //串列為空, 直接加入 pnode = person; } else { for(t=pnode;t->next!=NULL;t=t->next); //搜尋到串列結尾再加入 t->next = person; } } int print() { node *t; printf(" 學號 姓名 作業成績(15%%) 平常成績(15%%) 期中成績(30%%) 期末成績(40%%) 總成績\n"); printf("----------------------------------------------------------------------------------------\n"); for(t=pnode;t!=NULL;t=t->next) printf("%8s%10s%11.2f%14.2f%14.2f%14.2f%13.2f\n",t->id,t->name,t->homework, t->general,t->midterm,t->finalterm,t->sum); } int delete() { char id[20]; node *t,*pre; int i; printf("請輸入欲刪除學生ID: "); scanf("%s",&id); for(t=pnode,i=0;t!=NULL;t=t->next,i++) { if (strcmp(t->id,id) == 0) { //若欲刪除ID存在 if (i==0) { //若為串列頭, 直接移動pnode pnode = t->next; i=0; } else { //刪除節點 pre->next = t->next; t->next = NULL; t = pre; } break; } pre = t; //當下一個loop時, pre指向前一個節點. } print(); } 2008-03-31 18:37:05 補充: int main() { int i; char c; pnode = NULL; while(1) { fflush(stdin); printf("1. 加入學生資料\n"); printf("2. 刪除學生資料\n"); printf("3. 列印學生資料\n"); printf("請輸入選擇(結束請按'q'): "); scanf("%c",&c); 2008-03-31 18:37:22 補充: switch(c) { case '1': add(); break; case '2': delete(); break; break; case '3': print(); break; case 'q': exit(0); default: break; } }} 2008-04-08 23:09:27 補充: sorry, 貼code時似乎有些地方沒改好, 請將下面幾個地方修一下 1. printf中的 \n 是 \n, 知識家會咬字, 請自行替換過來 2. 請將下面幾行的"&"拿掉試試. scanf("%s",&id); // line 24 scanf("%s",&name); // line 26 scanf("%s",&id); // line 64 2008-04-08 23:09:36 補充: 3.注意在複製程式碼時是否有遺漏或多了些什麼東西. 另外 delete 這個字在VC裡面是否為keyword?? 如果是, 請將 delete() 改名再試試看. 4. scanf本來就不是很安全的函數, 本身就存在一些陷阱, 但是只要使用得當其實有時也還蠻好用的. 所以VC的那些scanf warning其實可以不必理會. 或是你可以參考warning建議的函數來替代使用. 因為我沒有用VC, 所以也不清楚 VC本身是不是有什麼限制, 不過我用dev c++ 跑是ok的.你先注意一下我上面說的幾點再試看看, 如果還有問題再討論 2008-04-09 13:37:26 補充: error C4716: 'add' : 必須傳回值的問題 ??? 我的add() function並沒有指定回傳值, 你可以將 int add() 改成 void add() 試試看. 如果其他函式有同樣問題, 都改成 void 就好了.
丸子(Lv.4) 2008 年 4 月 1 日

電腦與網際網路的其他問題