C語言指標的單向串列結構儲存(緊急)
可輸入學號、姓名、作業成績(佔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 就好了.