⑴ 關於刪除整個單鏈表的問題
其實你可以分為clear(清空內容,即不刪除頭結點,方便後續接著使用),以及destroy(當知道該鏈表不會再被使用時,包括頭結點全部銷毀)方法。
⑵ 單鏈表刪除操作
// 刪除節點,釋放內存空間
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。
結題吧。
⑶ 如何刪除鏈表(C語言).
把頭節點拆下,把剩下的結點當兩個,第一個作為第一個,剩下的作為第二個,先刪除第一個,在刪除第二個,直到第二個為空
⑷ C語言鏈表刪除問題
所謂鏈表,就是用指針將內存中動態分配的結點空間,鏈接起來成一個表。
所以,建表的過程即是每次為新結點分配內存;因此,釋放空間的話,也要從頭到尾,一個一個結點的釋放,這樣才能全部釋放掉。
這段代碼釋放了整個鏈表空間內存;while循環的作用是從頭到尾釋放後續結點,如果直接free(pHead)則後面的結點將無法找到,那麼造成內存空間泄露。
另外,你的while循環存在一個錯誤,假設釋放了倒數第一個結點後,pHead指向最後一個結點,而最後一個結點的next為NULL,那麼這樣最後一個結點也沒有釋放掉,while就退出了。
⑸ 如何刪除鏈表
單向鏈表節點的一般形式:
struct
node{
int
value;
node
*next;};
每個鏈表節點的next成員即為指向下個節點的指針。
不管鏈表是單向鏈表還是雙向鏈表或者其他什麼形式,刪除元素的思想是要知道即將被刪除的元素,以及該元素的上一個節點和下一個節點。把即將被刪除的元素的指針成員的值賦給其上一個節點的指針成員,再刪除元素,就能完成任務。
比如要刪除一個值為n的元素,我們可以如下判斷:
node
*temp
=
p->next;
if
(temp->value
==
n){
p->next
=
temp->next;
delete
temp;}
else
p
=
temp;
如此加上循環就能搜索鏈表中符合要求的元素並刪除。
⑹ 用數據結構刪除一串數值中重復的值如何編程
#include "stdafx.h"#include<iostream.h>class ListNode //定義單向鏈表的結點結構;class LinkList;LinkList::LinkList()//初始化void LinkList::HeadCreate()//輸入元素各個值 cout<<"整條鏈表為:"; p=head; while(p!=0) cout<<endl;//輸出該鏈表}void LinkList::TailCreate()//輸入元素各個值 head=head->next;//消除第一個空結點 cout<<"整條鏈表為:"; p=head; while(p!=0) cout<<endl;//輸出該鏈表}void LinkList::InsertBefore()//查找第i個結點結束 ListNode *TempNode; TempNode=new ListNode; cout<<"插入的數值:"; cin>>TempNode->data; p=head; cout<<"插入前的鏈表為:"; while(p!=0) cout<<endl;//輸出插入前的鏈表 if(a==1) //當插入的為第一個結點 else //當插入的不為第一個結點 p=head; cout<<"插入後的鏈表為:"; while(p!=0) cout<<endl;//輸出插入後的鏈表}void LinkList::Delete()//查找第i個結點結束 q=head; cout<<"刪除前的鏈表為:"; while(q!=0) cout<<endl;//輸出刪除前的鏈表 if(a==1) //當刪除的為第一個結點 else //當刪除的不為第一個結點 s=head; cout<<"刪除後的鏈表為:"; while(s!=0) cout<<endl;//輸出刪除後的鏈表}void LinkList::Locate()//鏈表從頭至尾查找 if(p==NULL) //查找成功 else //查找失敗}void LinkList::ListSize()void LinkList::Reserve()void main()//switch }//while}//main 如果幫助到您,請記得採納為滿意答案哈,謝謝!祝您生活愉快! vae.la
⑺ C語言鏈表 刪除
structLNode*delete(LNode*head)
{
LNode*node=head;
LNode**parent=&head;
doublemin,max;
printf("請輸入min和max:");
scanf("%lf%lf",&min,&max);
while(node)
{
//大於min和小於max,則刪除節點
if(node->data>min&&node->data<max)
{
*parent=node->next;
//如果你的LNode是malloc出來的,需要free(node);
node=*parent;
}
else
{
node=node->next;
parent=&node->next;
}
}
returnhead;
//這個邏輯不需要給你太多注釋,你只需要拿一支筆,手動畫一個3個節點的鏈表,
//然後從函數執行開始,一步一步去推怎麼執行的就懂了。
//至於你的程序的錯誤,沒幫你看
}
⑻ C語言中關於鏈表的刪除
所謂鏈表,就是用指針將內存中動態分配的結點空間,鏈接起來成一個表。
所以,建表的過程即是每次為新結點分配內存;因此,釋放空間的話,也要從頭到尾,一個一個結點的釋放,這樣才能全部釋放掉。
這段代碼釋放了整個鏈表空間內存;while循環的作用是從頭到尾釋放後續結點,如果直接free(pHead)則後面的結點將無法找到,那麼造成內存空間泄露。
另外,你的while循環存在一個錯誤,假設釋放了倒數第一個結點後,pHead指向最後一個結點,而最後一個結點的next為NULL,那麼這樣最後一個結點也沒有釋放掉,while就退出了。
while循環應該更正為:
while(pHead!=NULL)
{
pNext=pHead->next;
free(pHead);
pHead=pNext;
}
⑼ 怎樣刪除鏈表中的數據
如果鏈表表頭不是設置成全局,可以用下面函數處理
//刪除節點 刪除值為m的節點
//*phead為表頭指針
int deleteNode(LinkList *phead,int m)
{
LinkList p,q;//p為值是m的節點,q是p的前一個節點
if(*phead == NULL)//如果鏈表為空,做下溢處理
{
printf("單鏈表為空!\n");
return 0;
}
if((*phead)->data == m) //如果表頭值為m,刪除表頭
{
p=*phead;
*phead=(*phead)->next;
free(p);//釋放表頭
}
else //從第二個節點查找值是m的
{
q=*phead;
p=(*phead)->next;
//注意先p !=NULL,否則因沒有於m等值的節點將出現非法訪問操作
while(p !=NULL && p->data!=m )
{
q=p;
p=p->next;
}
if(p!=NULL)//找到了
{
q->next=p->next;//讓前一個節點指向p的後繼節點
free(p);//刪除節點p
}
else
{
printf("未找到值為%d的節點.\n",m);
return 0;
}
}
return 1;
}
⑽ c++如何刪除鏈表
struct或者class A
{
其他數據的定義
public
A *next;
};
假設已經建好的鏈表頭部指針為head,刪除鏈表的程序如下
A *tmp;
while(head)
{
tmp=head;
head=head->next;
delete tmp;
}