→ dendrobium:大概是First或sFirst所指的位置不正確 09/22 23:18
→ dendrobium:問題可能出在別的func裡面 09/22 23:18
附上整個程式碼好了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
我的struct
struct node{
int number;
struct node *next;
} *First, *sFirst, *Point, *sPoint, *smallest;
//---------------------------------------------------------------------------
產生節點的副程式: (會順便亂數產生一個1~1000的數字)
struct node* makeNode(void)
{
struct node *NewNode;
NewNode = (struct node*)malloc(sizeof(struct node*));
NewNode->number = rand()%1000+1;
NewNode->next = NULL;
return NewNode;
}
//--------------------------------------------------------------------------
主程式:
這個程式主要就是要請使用者輸入一個整數n
然後亂數產生一個有n個 1~1000 的整數鏈結串列
之後做選擇排序
不過由於選擇排序我怎麼弄都弄不好(一個鏈結串列)
只好偷吃步用另一個新的鏈結串列去接最小的數字
(撇開要求不談,選擇排序跟我這種做法有什麼差別嗎?)
void main()
{
int items;
srand(time(NULL));
printf("Enter the number of numbers to generate: ");
scanf("%d", &items);
makeFirstNode(); //建立兩個空節點
makeSortedFirstNode();
makeNumberList( items ); //產生鏈結串列
printNumbers(First);
selectionSort(); //排序
printNumbers(sFirst);
freeNode();
}
//---------------------------------------------------------------------------
建立空節點:
void makeFirstNode(void)
{
First = makeNode();
First->number = -1;
Point = First;
}
void makeSortedFirstNode(void)
{
sFirst = makeNode();
sFirst->number = -1;
sPoint = sFirst;
}
//---------------------------------------------------------------------------
產生n個節點且未排序的列結串列:
void makeNumberList(int items)
{
for (; items > 0; items--)
{
Point->next = makeNode();
Point = Point->next;
}
}
//-----------------------------------------------------------------------
印出串列內容
void printNumbers(struct node *First)
{
Point = First->next;
while (Point != NULL)
{
printf("%5d", Point->number);
Point = Point->next;
}
printf("\n");
}
//-----------------------------------------------------------------------
排序:
First Point
↓ ↓
◎→口→口→口→口→口→口→口→口→口→口→口→NULL
↑
smallest
sFirst ← (s:Sorted)
↓
◎→NULL
↑
sPoint
這是一開始的樣子
因為找到最小的數字後還要叫上一個節點回來
可是我不想用double link
所以只好用Point->next 來當作當下比較的結點
而因為每一次找目前串列中最小數的時候
第一個數都會跟第一個數,也就是自己來做比較
感覺沒什麼意義
所以把每次First 後面第一個點傳給sFirst串列的最後一個
然後Point再從第二個數字跟第一個數字作比較
如果有找到比較小的, Point->next 就換成該Point的點
最後比較完成之後才開始作移動節點的動作
之前的比較只是指來指去而已
並沒有移動
以下為程式碼
void selectionSort(void)
{
do
{
smallest = First;
Point = First->next;
sPoint->next = smallest->next;
while ( Point->next != NULL)
{
if ( Point->next->number < smallest->next->number)
smallest = Point;
Point = Point->next;
}
sPoint->next = smallest->next;
smallest->next = smallest->next->next;
sPoint->next->next = NULL;
sPoint = sPoint->next;
printNumbers(sFirst);
}while ( First->next != NULL);
}
這就是整個程式了@.@
有沒有可以直接貼上
而且可以自動幫我的程式碼上色的網站??
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:01)
推 dendrobium:你的First和sFirst是global variable ? 09/22 23:27
推 VictorTom:或者另一種可能, 原來的linked-list有記得把最後一個 09/22 23:47
→ VictorTom:node的next設成NULL嗎?? 有沒有可能list衝過頭了@_@" 09/22 23:48
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:02)
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:03)
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:04)
→ dendrobium:makeNode第二行 NewNode = ... sizeof(struct node*)); 09/23 00:05
→ dendrobium: 你看到問題了嗎? ^^^^^^^^^^^^ 09/23 00:07
→ sunneo:我也想要有massagebox XD 09/23 00:08
推 dendrobium:哈哈 09/23 00:10
→ liu2007:解決了 感謝 又是小地方Orz..... 09/23 00:27
推 QQ29:馬殺雞小盒子 09/23 00:34