[問題] 鏈結串鏈,刪除Node問題
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
在鏈結串鏈中. 想刪串鏈中第一個node, 編譯通過但執行盪掉
希望得到的正確結果:
原先建立的串列結果如下:
[Node],記憶體值=12ff1c,內容值=430090,value=0,next=430050
[Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0
[Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0
[Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60
[Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20
[Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0
[Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0
[Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60
[Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20
[Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0
於串列尾端加入一個node,結果如下:
[Node],記憶體值=12ff1c,內容值=430090,value=0,next=430050
[Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0
[Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0
[Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60
[Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20
[Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0
[Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0
[Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60
[Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20
[Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0
[Node],記憶體值=12ff1c,內容值=431de0,value=500,next=0
想要刪除串列中頭端的node, 但無法成功. 希望結果如下:
[Node],記憶體值=12ff1c,內容值=430050,value=1,next=431fe0
[Node],記憶體值=12ff1c,內容值=431fe0,value=2,next=431fa0
[Node],記憶體值=12ff1c,內容值=431fa0,value=3,next=431f60
[Node],記憶體值=12ff1c,內容值=431f60,value=4,next=431f20
[Node],記憶體值=12ff1c,內容值=431f20,value=5,next=431ee0
[Node],記憶體值=12ff1c,內容值=431ee0,value=6,next=431ea0
[Node],記憶體值=12ff1c,內容值=431ea0,value=7,next=431e60
[Node],記憶體值=12ff1c,內容值=431e60,value=8,next=431e20
[Node],記憶體值=12ff1c,內容值=431e20,value=9,next=431de0
[Node],記憶體值=12ff1c,內容值=431de0,value=500,next=0
程式跑出來的錯誤結果:
於main()中,在呼叫 deleteFirstNode(currentNode);
進入deleteFirstNode 函式中, free(pt) 該行程式會盪掉.
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
VC++
有問題的code: (請善用置底文標色功能)
#include <stdio.h>
#include<stdlib.h>
struct node
{
int a;
struct node * next;
};
typedef struct node Link;
Link* createNewNode(int a_value)
{
Link * NewNode =(Link *) malloc(sizeof(struct node));
NewNode->a = a_value;
NewNode->next = NULL;
return NewNode;
}
void freeALLNode(Link * Head)
{
while(Head != NULL)
{
Link *pt = Head;
Head = Head ->next;
free(pt);
}
}
void LinkNode(Link * NodeA, Link * NodeB)
{
NodeA->next = NodeB;
}
Link* search_key1(int k,Link *Node)
{
Link * search_pt = Node;
while(search_pt != NULL)
{
if(search_pt->a == k)
{
printf( "找到Node,記憶體=%x,內容值 \
=%x,value=%d,Next=%x\n" \
,&search_pt \
,search_pt \
,search_pt->a \
,search_pt->next );
return search_pt;
}
search_pt = search_pt->next;
}
return NULL;
}
void insertOneNode(Link *currentNode , Link * insertNode)
{
Link *tempNode;
tempNode = currentNode->next;
currentNode->next = insertNode;
insertNode->next = tempNode;
}
Link * deleteFirstNode(Link * Head)
{
Link *pt;
pt = Head;
Head = pt->next;
pt->next = NULL;
free(pt);
return Head;
}
void print_link(Link * pt)
{
printf("--Display-----------------------------------------\n");
while(1)
{
printf("[Node],記憶體值=%x,內容值=%x,value=%d,next=%x\n", \
&pt,pt,pt->a,pt->next);
if(pt->next == NULL)
break;
pt = pt->next;
}
printf("--------------------------------------------------\n");
}
void main()
{
//建立連結串列,配置記憶體-------------------
Link **Node = (Link **) malloc( 10 * sizeof(Link *));
int i=0,k=10;
while(i<k)
{
*(Node+i) = createNewNode(i);
i++;
}
i=0;
while(i<(k-1))
{
LinkNode(*(Node+i),*(Node+i+1));
i++;
}
//-------新增一個node------------------------
Link *currentNode = NULL;
//插入一個node
Link *insertNode = createNewNode(500);
currentNode = search_key1(9, *(Node +0) ); //有找到回傳指標,否則為NULL
if(currentNode != NULL)
insertOneNode(currentNode,insertNode);
//印出鏈結串列
print_link(*(Node +0));
//-------刪除第一個node-----------------------
currentNode = *(Node +0);
Link * returnNode =deleteFirstNode(currentNode);
//印出鏈結串列
print_link(returnNode);
//釋放鏈結串列記憶體--------------------------
freeALLNode(currentNode);
}
補充說明:
上次PO感謝大家回文,
這次麻煩大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.231.132
→
10/18 22:19, , 1F
10/18 22:19, 1F
→
10/18 22:20, , 2F
10/18 22:20, 2F
→
10/18 22:24, , 3F
10/18 22:24, 3F
→
10/18 22:27, , 4F
10/18 22:27, 4F
→
10/18 22:28, , 5F
10/18 22:28, 5F
→
10/18 22:30, , 6F
10/18 22:30, 6F
※ 編輯: WishSmile 來自: 61.230.231.132 (10/18 22:33)
→
10/18 22:32, , 7F
10/18 22:32, 7F
→
10/18 22:32, , 8F
10/18 22:32, 8F
→
10/18 22:34, , 9F
10/18 22:34, 9F
→
10/18 22:35, , 10F
10/18 22:35, 10F
→
10/18 22:36, , 11F
10/18 22:36, 11F
→
10/18 22:36, , 12F
10/18 22:36, 12F
→
10/18 22:38, , 13F
10/18 22:38, 13F
→
10/18 22:38, , 14F
10/18 22:38, 14F
→
10/18 22:39, , 15F
10/18 22:39, 15F
→
10/18 22:39, , 16F
10/18 22:39, 16F
→
10/18 22:39, , 17F
10/18 22:39, 17F
→
10/18 22:40, , 18F
10/18 22:40, 18F
→
10/18 22:40, , 19F
10/18 22:40, 19F
→
10/18 22:41, , 20F
10/18 22:41, 20F
→
10/18 22:42, , 21F
10/18 22:42, 21F
→
10/18 22:42, , 22F
10/18 22:42, 22F
→
10/18 22:43, , 23F
10/18 22:43, 23F
→
10/18 22:44, , 24F
10/18 22:44, 24F
→
10/18 22:45, , 25F
10/18 22:45, 25F
→
10/18 22:45, , 26F
10/18 22:45, 26F
→
10/18 22:46, , 27F
10/18 22:46, 27F
→
10/18 22:46, , 28F
10/18 22:46, 28F
→
10/18 22:48, , 29F
10/18 22:48, 29F
→
10/18 22:50, , 30F
10/18 22:50, 30F
推
10/19 06:59, , 31F
10/19 06:59, 31F