//它目前還不是一個非常成熟的LINK-Stack,我會更新它。 我試圖釋放linklist-style
堆棧中的每個節點時遇到此錯誤:銷燬(免費)鏈表式堆棧中的所有東西?
根據解決方案1,這是一個可編譯但不可執行的腳本。也許我的問題發生時,我想分配一個地址(* S),但(* S)已釋放ALREADY?
關於破壞函數,我想釋放之前分配給(S)的RAM中的每個節點,使RAM可重用。
那麼爲什麼第一個功能不可用?我不知道在C中刪除一個變量,我的意思是刪除它的地址。也許通常的變量不能通過FREE()釋放? PPS:當我使用free()時,我認爲它只是釋放RAM,但保留可能指向NULL或somwhere的變量的名稱或標識符,這是危險的,但在Solution1中,似乎我必須這樣做。
//IDE:Dev C++ 5.11
#include<stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Stack
{
struct Stack *next;
ElemType data;
} Stack,*LinkStack;
int InitStack(LinkStack *S) {
*S = (LinkStack)malloc(sizeof(struct Stack));
if(!*S) return -1;
(*S)->next=NULL;
(*S)->data =0;
printf("Maybe successfully initialized.\n");
return 0;
}
int Push(LinkStack *S, ElemType e)
{
LinkStack pt = (LinkStack)malloc(sizeof(struct Stack));
LinkStack newpt = (LinkStack)malloc(sizeof(struct Stack));
newpt->data = e;
pt = (*S)->next;
int number = 0;
if (!pt)
{
printf("#a one time \n");
(*S)->next = newpt;
(*S)->data++;
return 1;
}
else
{
while (number < (*S)->data)
{
pt = pt->next;
number++;
}
pt->next = newpt;
newpt->next = NULL;
(*S)->data++;
return 0;
}
}
int StackTraverse(LinkStack S)
{
LinkStack pt = (LinkStack)malloc(sizeof(struct Stack));
pt = (S)->next;
while (pt)
{
printf("%d__", pt->data);
pt = pt->next;
}
return 0;
}
Solution1: //unavailable
void DestroyStack(LinkStack *S)
{
while (*S)
{
LinkList pt = (*S)->next;
free(*S);
(*S) = pt;
}
printf("Node destroyed!\n");
}
int main()
{
LinkStack Sb;
InitStack(&Sb);
ElemType *e = (ElemType *)malloc(sizeof(ElemType));
while (scanf("%d", e))
{
Push(&Sb, *e);
printf("you have entered : %d.\n", *e);
}
free(e);
printf("%d\n", Sb->next->next->data);
StackTraverse(Sb);
DestroyStack(&Sb);
if (!Sb)
{
printf("succeed\n");
}
return 0;
}
於是我想出了另一種功能!使用遞歸,但是當我插入3個節點的linklist-style
堆棧,似乎「LinkStack破壞」打印6次。當我插入4個節點時,它會打印7次。
solution2: //available ,but not work well
void DestroyStack(LinkStack *S) {
while(*S){
LinkStack pt=(*S);
(*S)=(*S)->next;
printf("#a\n");
DestroyStack(S);
}
printf("LinkStack Destroyed!");
}
謝謝你的幫忙!
OOPS !!!!我把solution1和solution2放在一個錯誤的地方,一個是可用的,另一個不可用。 – justinRen
請[編輯]你的問題,告訴我們你做了什麼樣的調試。我希望你已經在Valgrind或類似的檢查器中運行你的[mcve],並且已經使用例如GDB的調試器進行了調查。確保你也啓用了一整套編譯器警告。這些工具告訴你什麼,他們缺少什麼信息?並閱讀Eric Lippert的[如何調試小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –
@ TobySpeight,對不起,我隨便上傳了一個問題。我會按照你的建議,並提出更好的問題.... 0.0謝謝你的建議。 – justinRen