導航:首頁 > 編程系統 > linux刪除鏈表

linux刪除鏈表

發布時間:2021-02-23 15:53:50

㈠ 單鏈表刪除操作

|// 刪除節點,釋放內存空間
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。

結題吧。

㈡ 如何從linux鏈表刪除元素

內核的鏈表list_head設計相當巧妙。今天我說一下對list_head鏈表的遍歷時如何刪除元素。內
鏈表遍歷時,如果刪除當前元容素,一般都是會出錯的。在所有語言的各種庫中的鏈表都是如此。list_head也一樣。

㈢ 如何刪除鏈表中的某個元素

單向鏈抄表節點的一般形式:
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;
如此加上循環就能搜索鏈表中符合要求的元素並刪除。

㈣ 假如要實現刪除鏈表的演算法DestroyList(LinkList &L),應如何實現

有點小錯誤

void DestroyList(LinkList L) // 和要抄求的不一致,應該是LiskList &L
{
node *pre,*p;
pre=L; // 指針和引用搞混

可以更簡單一點:
void DestroyList(LinkList& L)
{
node *p = L.next;
while(p)
{
node *r=p;
p=p->next;
free(r);
}
L.next = NULL;
}

㈤ C++刪除鏈表節點

struct student *del(struct *head,long num)
{struct student *p,*p2;
int n;
if(head==NULL)
{printf("\nlist null!\n");goto end;}
p2 = p = head;
while(num!=p->num&&p->next!=NULL)
{p2=p,p=p->next;}
if(num==p->num)
{
if(p==head)
head=p->next;
else p2->next=p->next;
prinf("delete:%d\n",num);
n=n-1;
}
else{printf("%d not been found!\n",num);
return(head);
}

㈥ 如何刪除鏈表

head==NULL的意思是抄說根本就沒有頭結襲點!
根本就不可能有p1了!
刪除頭結點的話
pre=head;
if(head==NULL)
printf("該鏈表沒有任何結點,無頭結點可刪!");
else
{
pre=pre->next;
free(head);
}
return
pre;

㈦ 怎樣刪除鏈表中的數據

如果鏈表表頭不是設置成全局,可以用下面函數處理
//刪除節點 刪除值為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語言).

#include <stdlib.h>

typedef struct node
{
DataType value;
struct node *next;
}LinkList;

void list_destroy(LinkList *head)
{
LinkList *pdes;

for(pdes = head; NULL != head->next; pdes = head->next)
{
head->next = pdes->next;
free(pdes);
pdes = NULL;
}
}

㈨ 請高手回答 簡單 鏈表刪除 問題,。。。。。。。。。。。

void del(node *head,int n)
{
node *qq;
for(int i=1;i<n;i++)
head=head->next;
qq=head;
head=head->next;
free(qq);
}
如果head是你想刪除的節點,那麼你需要做的是讓head的上一個節點的next指針指向head的下一個節點,從而跳過head,然後才能free head。你修改了head的next指針然後free了head,毫無意義。

但是,如果你想刪除第一個節點(也就是del(head, 1)這樣的),你將無法把新的「頭節點」傳回給main函數。

解決方法1:一個是保留一個永久的頭節點,如果鏈表空,表示鏈表只有頭節點。如果鏈表有1個元素,那麼鏈表只有頭節點和頭節點後面緊挨著的一個節點。

解決方法2:你的del函數返回新的鏈表頭節點。
node* del(node *head, int n)
{
node *pPre;
node *pNow;

if (!head)
return NULL;

if (1 == n)
{
node *result = head->next;
free(head);
return result;
}

pNow = head;
for(int i=1;i<n;i++)
{
pPre = pNow;
if (!pNow)
return head;
pNow=pNow->next;
}
pPre->next = pNow->next;
free(pNow);
return head;
}

然後調用時使用head = del(head, 3);

㈩ 鏈表刪除節點 Linux 下 段錯誤

代碼沒有問題,可能是:
List->Head沒有賦值。
鏈表最一個節點的Next沒有設置為NULL。

閱讀全文

與linux刪除鏈表相關的資料

熱點內容
關於旅遊收入的數據從哪裡找 瀏覽:989
gson解析json集合問題 瀏覽:680
安卓ipsec標識符填什麼 瀏覽:215
在哪裡解壓文件第一分卷 瀏覽:63
奧維使用教程 瀏覽:324
編程程序怎麼轉到plc上 瀏覽:807
文件名沖突但是找不到 瀏覽:261
上海瑞金醫院app下載 瀏覽:998
qq群里的機器人買武器 瀏覽:428
捕魚達人歷史版本 瀏覽:73
mp4視頻文件解密軟體 瀏覽:62
多軸編程哪個軟體最方便 瀏覽:27
老平板哪個是顯示屏數據線插座 瀏覽:849
5sing上傳音頻文件格式 瀏覽:171
win10輸入文件滑鼠右鍵異常 瀏覽:634
聽幼兒故事用什麼app 瀏覽:514
iphone修改音頻文件名 瀏覽:53
國家氣象站點數據在哪裡下載 瀏覽:342
網路設置的網站 瀏覽:914
手機測量放樣怎麼導數據和線型 瀏覽:648

友情鏈接