Ⅰ 求問個c語言問題,刪除鏈表節點的時候 為什麼要釋放被刪節點,不釋放也不影響呀
如果不釋放的話會造成內存泄露。
比如一個業務邏輯中需要不斷的增加節點,並不斷的刪除節點,如果不釋放節點的內存空間的話,假設每個節點占內存8位元組,那麼這個塊邏輯執行足夠多次數,內存就放不下了。這就是隱患了。
(尤其處理的數據量級較大時,這個問題會比較明顯)
Ⅱ C++鏈表節點刪除方法,如何合適的釋放內存
既然有ListNode,就應該有List類,將removeElements封裝到List類中,由List類負責內存的分配和釋放;
這樣責任就清晰了。
再就是結點的分配一般都是在堆上申請,在棧上連接起來的結點當然無法刪除;
如果非得需要按照這樣的實現,在棧上應用list,那麼只用更改結點指針就好了,不用delete,棧上的即結點在退出程序邏輯范圍時自動刪除了;
Ⅲ C語言中關於鏈表的刪除
所謂鏈表,就是用指針將內存中動態分配的結點空間,鏈接起來成一個表。
所以,建表的過程即是每次為新結點分配內存;因此,釋放空間的話,也要從頭到尾,一個一個結點的釋放,這樣才能全部釋放掉。
這段代碼釋放了整個鏈表空間內存;while循環的作用是從頭到尾釋放後續結點,如果直接free(pHead)則後面的結點將無法找到,那麼造成內存空間泄露。
另外,你的while循環存在一個錯誤,假設釋放了倒數第一個結點後,pHead指向最後一個結點,而最後一個結點的next為NULL,那麼這樣最後一個結點也沒有釋放掉,while就退出了。
while循環應該更正為:
while(pHead!=NULL)
{
pNext=pHead->next;
free(pHead);
pHead=pNext;
}
Ⅳ 單鏈表刪除操作
// 刪除節點,釋放內存空間
p->next = p->next->next;
delete p->next;
******************************************
若鏈表為:
鏈表節點 | 1 | 2 | 3 |...
對應指針 | p | p->next | p->next->next|...
你想刪除節點2(p->next),
但你的做法是:
p->next = p->next->next;(1的下一個由指向2改為指向3);
鏈表節點 | 1 | 2 | 3 |...
對應指針 | p | | p->next |...
delete p->next;(刪除3)
這就錯了,若要刪除必須先將被刪的節點2保存給臨時變數,修改鏈表後再刪除。正確的做法是:
linkList* tmp = NULL;
...
tmp = p->next;
p->next = p->next->next;
delete tmp;
另外,while (p && cnt != location - 1)這種寫法雖然正確,但很不規范且危險,容易出現優先順序和默認值的疏忽。
關於你補充的問題,不分析你的代碼了,直接給你重寫一個吧,看懂了就可以自己改了。
void Sort(linkList* L)
{
bool done_flag = FALSE;
linkList* p = L;
linkList* temp = NULL;
if (p->next == NULL)
{
return;
}
/*你的鏈表結構存在獨立首節點,所以p可以直接做兩個交換節點的父節點*/
/*若未發現亂序,說明已經排好*/
while(!done_flag)
{
done_flag = TRUE;
/*遍歷鏈表 保證p下至少存在兩個節點*/
while(p->next->next != NULL)
{
/*若順序錯誤則對換*/
if (p->next->name[0] > p->next->next->name[0])
{
/*存在亂序*/
done_flag = FALSE;
/*鏈表:p p1 p2 p3*/
/*交換p1 p2*/
/*temp 指向 p1*/
temp = p->next;
/*p 的下一個改為 p2*/
p->next = p->next->next;
/*將 p3掛到p1後面,此時p的下一個是p2,所以p的下一個的下一個是p3,temp此時為p1*/
temp->next = p->next->next;
/*p 的下一個此時為 p2,將p2的下一個指向 temp(p1)*/
p->next->next = temp;
}
/*p後移*/
p = p->next;
}
}
}
bool你那裡有問題的話,可以改為int或char。
結題吧。
Ⅳ 順序表、鏈表清空和銷毀
我正好在學數據結構,以下是我的理解,自以為還比較靠譜。你參考著看吧。
ClearList只是把線性表中原來存儲元素的空間中存的那些元素都清除了,類似於把原線性表改成一個空的線性表,但這個線性表是確實存在的。
而Destroy是把整個線性表占的空間都釋放了,這個線性表結構都不存在了,下次想做一個線性表只能重新初始化。
下面是我在老師給的課件找到的粗略演算法:
順序表的:
銷毀線性表L
void DestroyList(SqList*L)
{
if (L->elem) free(L->elem); //釋放線性表占據的所有存儲空間
}
清空線性表L
void ClearList(SqList*L)
{
L->length=0; //將線性表的長度置為0
}
鏈表的:
銷毀鏈表L
void DestoryList(LinkList *L)
{
NODE *p;
while (L->head){ //依次刪除鏈表中的所有結點
p=L->head; L->head=L->head->next;
free(p);
}
}
清空鏈表L
void ClearList(LinkList *L)
{
NODE *p;
while (L->head->next){
p=L->head->next; //p指向鏈表中頭結點後面的第一個結點
L->head->next=p->next; //刪除p結點
free(p); //釋放p結點占據的存儲空間
}
}
具體的在C環境編程實現的話還要加工下的。
希望能給你點啟發!
Ⅵ 設二叉樹以二叉鏈表存儲,刪除一顆二叉樹,並釋放所有的結點空間的演算法
typedef struct Bitnode //二叉樹結點定義
{
int data;
struct Bitnode *lchild;
struct Bitnode *rchild;
}Bitnode;
Bitnode* Binary_Create() //創建二叉樹
{
Bitnode *t = NULL;
int n;
scanf("%d", &n);
if (n != 0)
{
t = (Bitnode *)malloc(sizeof(Bitnode));
if (t == NULL)
printf("內存分配錯誤!");
else
{
t->data = n;
t->lchild = Binary_Create();
t->rchild = Binary_Create();
}
}
return t;
}
void Binary_Output(Bitnode *t) //前序遍歷二叉樹
{
if (t != NULL)
{
printf("%d ", t->data);
Binary_Output(t->lchild);
Binary_Output(t->rchild);
}
}
void Binary_Delete(Bitnode *t) //釋放空間
{
if (t != NULL)
{
Binary_Delete(t->lchild);
Binary_Delete(t->rchild);
free(t);
}
}
void Inorder(Bitnode *t) //中序遍歷
{
if ( t != NULL)
{
Inorder(t->lchild);
printf("%d ", t->data);
Inorder(t->rchild);
}
}
Ⅶ Visual C++ 中怎樣調用DeleteList函數刪除鏈表中的某一結點,並釋放被刪除結點所佔的存儲空間
=(j+m-1) % LengthList(t);
DeleteList(&t, x=GetList(t,j));
如果 DeleteList的第二個參數是刪除 表的第j個節點 那麼
填 (x=GetList(t,j),j) 上面填的是搜索到節點值 再刪除 要求的是沒有重復的節點值