各位賢拜好,請幫忙協助剛學C++的小弟我
教授出了一個作業,完成一個程式,可以讓使用者輸入多筆資料,每筆資料內容有:
學生姓名,學號,作業,期中,期末成績,各成績所佔的計分比重
以及當使用者要計算總分的時候才去呼叫一個計算的函數,
並且可以新增或移除某一筆資料,
而整個輸出必須依照學號大小排序,
而且盡量不使用陣列,要使用LINK LIST (SINGLE OR DOUBLE)的方法
產生一個一個NODE去鏈結,
這對剛學C++的小弟而言有許多困難的地方,但是教授的要求又不能擺爛,
請各位賢拜幫幫忙,請教我如何完成,如果有程式碼可以指導我更佳
我是真的想學習,並不是只是為了交出作業,請別吝嗇的教導小弟,
大恩大德感激不盡 orz
2006-02-12 03:26:13 · 2 個解答 · 發問者 ? 1 in 電腦與網際網路 ➔ 程式設計
非常感謝比爾大師...
雖然裡面有許多不懂的地方,爬了一些文之後,我大致上已經都瞭解了,對於LINK LIST也比較認識,非常感謝你.
但是還是有幾個地方不太懂,希望你能再幫我解答
第一
char ID[20],Nm[20];
memset(pt->ID,0,20);
memset(pt->Nm,0,20);
pt->ID[19]=0;
pt->Nm[19]=0;
if(memcmp(hd->ID,ID,20)==0)
那幾句是什麼意思?為什麼要降做?如果不做會有什麼影響??好像在刪除的地方就會出錯,請大師指點一下
2006-02-13 14:04:13 · update #1
第二
if(strcmp(hd->ID,pt->ID)>0) 是不是可以看成hd-pt >0的時候條件成立,是這樣子嗎??我是這樣解讀的,不知道對不對
麻煩你了
另外要特別感謝龍大哥,他也幫了我大忙..感謝感謝各位
2006-02-13 14:04:30 · update #2
2000字限制無法多說明,請參考,有問題再問(程式已測過)
#include
#include
#include
#include
struct stdnt{
char ID[20],Nm[20];
int HW,MT,Fl;
float wH,wM,wF;
stdnt *next;
};
stdnt*pt,*hd=NULL,*cr,*pr;
float W_HW=.3,W_MT=.3,W_FL=.4;
void iNode()
{
char ch;
//新增一節點並輸入資料
pt=(stdnt*)malloc(sizeof(stdnt));
memset(pt->ID,0,20);
memset(pt->Nm,0,20);
cout << "學號: ";
cin >> pt->ID;
pt->ID[19]=0;
cout << "姓名: ";
cin >> pt->Nm;
pt->Nm[19]=0;
cout << "作業: ";
cin >> pt->HW;
cout << "期中: ";
cin >> pt->MT;
cout << "期末: ";
cin >> pt->Fl;
cout << "採預設評分標準(Y/N)?";
cin >> ch;
if(ch!='y' && ch!='Y')
{
cout << "作業比重:";
cin >> pt->wH;
cout << "期中比重:";
cin >> pt->wM;
cout << "期末比重:";
cin >> pt->wF;
}
else
{
pt->wH=W_HW;
pt->wM=W_MT;
pt->wF=W_FL;
}
//將節點加到link(順便排序)
if(hd!=NULL)
{
if(strcmp(hd->ID,pt->ID)>0) //置第一節點之前
{
pt->next=hd;
hd=pt;
}
else
{
pr=hd;
cr=hd->next;
while(cr!= NULL)
{
if(strcmp(cr->ID,pt->ID)>0)
break;
pr=cr;
cr=cr->next;
}
pr->next=pt;
pt->next=cr;
}
}
else
{
hd=pt; //成為第一節點
pt->next=NULL;
}
}
void dNode()
{
char ID[20]={0};
bool flag=false;
stdnt *nd;
if(!hd)
cout << endl << "無資料" << endl;
else
{
cout << "學號: ";
cin >> ID;
ID[19]=0;
if(memcmp(hd->ID,ID,20)==0)
{
nd=hd; //刪除第一節點
hd=hd->next;
free(nd);
cout << endl << ID << "刪除成功" << endl;
}
else
{
pr=hd;
cr=hd->next;
while(cr!=NULL)
{
if(memcmp(cr->ID,ID,20)==0)
{
flag=true;
break;
}
pr=cr;
cr=cr->next;
}
if(flag)
{
nd=cr;
pr->next=cr->next;
free(nd);
cout << endl << ID << "刪除成功" << endl;
}
else
cout << endl << "無此資料" << endl;
}
}
}
float Cacu(stdnt* p)
{
return p->HW*p->wH+p->MT*p->wM+p->Fl*p->wF;
}
void pNodes()
{
if(!hd)
cout << endl << "無資料" << endl;
else
{
cr=hd;
cout << endl;
do
{
cout << "學號:" << cr->ID << "姓名: " << cr->Nm << " 總分: " <
}while(cr!= NULL);
}
}
void main(void)
{
char ch;
while(1)
{
system("cls");
cout << "Menu\n";
cout << "1) Insert\n";
cout << "2) Delete\n";
cout << "3) Print\n";
cout << "4) Quit\n";
cout << "Choice? ";
cin >> ch;
switch(ch)
{
case '1':
iNode();
break;
case '2':
dNode();
break;
case '3':
pNodes();
break;
case '4':
exit(0);
default:
cout << endl << "
}
system("pause");
}
}
2006-02-14 22:00:13 補充:
monkey大大,
memset(pt->ID,0,20);及memset(pt->Nm,0,20); 代表將節點pt中的ID及Nm全清為零,個人寫程式時習慣給變數初值,至於陣列則會清成零。
2006-02-14 22:06:59 補充:
monkey大大,因為C的字串是所謂NULL Endding,也就是說字串的結尾一定等於0x00,所以pt->ID[19]=0;及pt->Nm[19]=0;是強迫限制ID及Nm長度在19字元。可避免ID或Nm長度超過19字元時,列印內容出時可能會出現錯將其它資料一併印出的問題。
2006-02-14 22:13:04 補充:
monkey大大,
if(memcmp(hd->ID,ID,20)==0)
那幾句,是為了考量,我們要刪除的節點有可能是串列的起點,程式中一直以hd記住串列的起點,因此不同於移除其它節點,需要特別處理:
(1)nd=hd;//先以nd記住hd位置
(2)hd=hd->next; //將hd指向串列下一節點
(3)free(nd); //歸還nd記憶體
2006-02-14 22:22:04 補充:
monkey大大,
strcmp(hd->ID,pt->ID)是字串比較的意思,結果>0,表示hd->ID值比pt->ID大,這代表串列第一節點的學號大於新節點的學號時條件成立。(學號排序採由小到大排列)
2006-02-14 22:25:05 補充:
monkey大大,學海無涯,彼此切搓,大師云云,愧不敢當。
2006-02-12 15:18:29 · answer #1 · answered by 明宏 2 · 0⤊ 0⤋
若真想學,在知識+裡找"鏈結串列"或"linked list"都可找到很多學習資料.
2006-02-12 21:51:34 · answer #2 · answered by 龍 7 · 0⤊ 0⤋