[問題] 為什麼我無法free?
void freeNode(void)
{
struct node *temp;
while ( First != NULL )
{
temp = First;
First = First->next;
free(temp);
system("pause");
}
while ( sFirst != NULL )
{
temp = sFirst;
sFirst = sFirst->next;
free(temp);
}
}
這是我要free調我所malloc的函式
可是執行到free(temp);
這行的時候
卻出現錯誤的massagebox
為什麼?
我的用法有錯嗎?
該include 我都有@.@
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.47.66
※ 編輯: liu2007 來自: 118.232.47.66 (09/22 23:14)
→
09/22 23:18, , 1F
09/22 23:18, 1F
→
09/22 23:18, , 2F
09/22 23:18, 2F
附上整個程式碼好了
#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)
推
09/22 23:27, , 3F
09/22 23:27, 3F
推
09/22 23:47, , 4F
09/22 23:47, 4F
→
09/22 23:48, , 5F
09/22 23:48, 5F
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:02)
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:03)
→
09/23 00:03, , 6F
09/23 00:03, 6F
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:04)
→
09/23 00:05, , 7F
09/23 00:05, 7F
→
09/23 00:07, , 8F
09/23 00:07, 8F
→
09/23 00:08, , 9F
09/23 00:08, 9F
推
09/23 00:10, , 10F
09/23 00:10, 10F
→
09/23 00:27, , 11F
09/23 00:27, 11F
推
09/23 00:34, , 12F
09/23 00:34, 12F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章