小弟最近要交作業...老師出了一個關於鏈結串列的問題!
就是"在鏈結串列加入節點"...就是把輸入的數值列出來...
但是老師似乎是心情不太好...改了題目...
除了要加入節點...還要把輸入的數值由小到大排列...
"在鏈結串列加入節點"這個我們會...但是由小到大排列...
我們嘗試很久都失敗...不知道有哪位高手大大可以幫小弟解惑一下...
小弟必將以重'點數'回禮!!
以下是"在鏈結串列加入節點" :
------------------------------------------------------------------------------------------------------------
#include
#include
typedef struct list /* 宣告鏈結串列結構 */
{
int data; /* 資料欄位 */
struct list *link; /* 指標欄位 */
}node;
void main( )
{
node *head=NULL; /* 鏈結串列起始指標 */
node *new_node; /* 新節點指標 */
node *ptr; /* 走訪鏈結串列指標 */
int input; /* 使用者輸入值 */
printf("請輸入Ctrl+Z表示資料輸入結束\n");
printf("請輸入節點內容(int)=>\n");
while(scanf("%d", &input) != EOF)
{ /* 若輸入值為EOF(檔案結束碼)才停止迴圈 */
new_node=(node *)malloc(sizeof(node)); /* 配置記憶體空間 */
if(new_node == NULL) /* 檢查記憶體指標 */
{
printf("記憶體配置失敗!\n");
exit(1); /* 結束程式 */
}
new_node->data=input; /* 將輸入值放入新節點的資料欄位 */
if(head == NULL) /* 若鏈結串列為空串列時 */
{
head=new_node; /* 鏈結串列的起始節點即為新加入的節點 */
new_node->link=NULL; /* 將新節點的鏈結欄位設為NULL */
}
else /* 先走訪至最後一個節點,再將新節點接到後面 */
{
for(ptr=head; ptr->link!=NULL; ptr=ptr->link);
new_node->link=ptr->link;
ptr->link=new_node;
}
}
printf("\n印出鏈結串列內容:\n");
/* 利用指標走訪鏈結串列 */
for(ptr=head; ptr!=NULL; ptr=ptr->link)
printf("[%d]", ptr->data); /* 印出鏈結串列節點內容 */
printf("\n");
}
---------------------------------------------------------------------------------------------------------------
要修改或是加入來達到把輸入的數值由小到大排列!
希望有好心的高手可以幫小弟的忙...感恩!!
2005-11-08 13:31:15 · 4 個解答 · 發問者 旺旺 2 in 電腦與網際網路 ➔ 程式設計
我將您的程式這三行處理排序的地方,也就是原本用作照輸入順序排序的地方
--------------------------------------------------------------------------------------------
for(ptr=head; ptr->link!=NULL; ptr=ptr->link);
new_node->link=ptr->link;
ptr->link=new_node;
--------------------------------------------------------------------------------------------
改成以下程式,完成由小到大的排列,並且加了比程式還多的註解(汗):
--------------------------------------------------------------------------------------------
if(new_node->data < head->data){ /*如果
2005-11-08 20:07:50 · answer #1 · answered by Anonymous · 0⤊ 0⤋
阿拉布丁 大大血滴好複雜~布過還是看懂ㄌ0.0+
2007-12-22 18:24:34 · answer #2 · answered by Alexis 3 · 0⤊ 0⤋
縮排問題是奇摩知識網的問題
任何縮排放上去都會變成沒有縮排
2005-11-09 06:10:30 · answer #3 · answered by Mark 5 · 0⤊ 0⤋
這個程式是你自己寫的嗎?
如果是的話我覺得你很厲害~單向鏈結觀念很清楚QQ
(1)首先在main函數內宣告一個
int count=0;
new_node->data=input; /* 將輸入值放入新節點的資料欄位 */
count++;//count放在這邊,如果有加入新節點成功的話就會累計
(2)在印出陣列之前呼叫sort函數排列,即
sort(head,count);//排列大小
printf("\n印出鏈結串列內容:\n");
(3)sort函數放在main函數的上方,typedef的下方,因為我懶得宣告函數原型@@
void sort(node *p,int count){//*p參數為原本鏈結的首節點,count為資料數量
int i,value;
node *ptr;//設定一個暫時的指標
ptr=p;//把p送到暫時指標內
for (i=1;i<=count;i++){//for之內的排序就是泡沫排序法
while(ptr->link !=NULL){//如果ptr的下個鏈結不為空的則瘋狂回圈
if ( ptr->link->data < ptr->data ){//if 裡面的為比大小然後把小的排在前面
value=(ptr->link)->data;
(ptr->link)->data=ptr->data;
ptr->data=value;
}
ptr=ptr->link;//ptr指向首節點,把ptr指向後一個節點,第二節點再跟第三比
}//while迴圈跳出時,能保證最大的數值跑到最後一個鏈結
ptr=p;//記得把ptr重新指向首節點,因為下次while要重首節點開始
}
}
P.S.想了大概一個小時,不過感謝你也讓我學到很多0.0
2005-11-08 20:27:42 · answer #4 · answered by 米奇 3 · 0⤊ 0⤋