當前位置:首頁 » 編程語言 » 鏈表刪除c語言

鏈表刪除c語言

發布時間: 2022-04-18 14:33:19

c語言,刪除鏈表中指定值的節點

刪除鏈表中的一個結點,要把前一個結點和後一個結點連起來,你光刪除沒有連起來。
Liste
delister
(Liste
liste,
int
v)
{
Liste
tmp1=liste,tmp2=NULL;
int
flag=0;
tmp2=tmp1;
while(
tmp1
!=
NULL
)
{
if(tmp1->valeur
==
v)
{
if(tmp2!=
tmp1)
tmp2->lien=tmp1->lien;
/*頭結點可直接刪除,中間結點刪除前要先連接前後的結點*/
free(tmp1);
tmp1=tmp2->lien;
flag=1;
}
else
{
tmp2=tmp1;
//記錄前一個結點
tmp1=tmp2->lien;
}
}
if(!flag)
printf("v
isn't
in
the
list");
return
liste;
}

② c語言 刪除鏈表的某個節點

temp=p;
p=p->next;
temp->next=NULL;
這三句存在問題,temp=p,讓temp指向p所指向的節點,p=p->next,p指向後移
temp->next=NULL,讓temp的後繼為空,這里出了問題,
鏈表
從temp指向的節點斷開,相當於刪除p之後的所有節點。
應該先判斷p是不是最後節點
if(p->next==NULL)
如果是,只好去找p的前趨pre,讓pre->next=NULL,free(p)
如果不是最後節點,將p的後繼節點數值域復制給p,然後將p的後繼節點刪除,等同與刪除p
p->data=p->next->data;
p->next=p->next->next;
free(p);

③ 數據結構(C語言版)中的刪除鏈表中的一個節點

代碼如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct List

{

int a;

List* next;

}list;

void newList(list* l)//創建結點

{

list* a[4];

for (int i = 0; i < 4; i++)

{

a[i] = (list*)malloc(sizeof(list));

a[i]->a = i+1 ;

}

l->next = a[0];

a[0]->next = a[1];

a[1]->next = a[2];

a[2]->next = a[3];

a[3]->next = NULL;

}

void printfList(list* l)//列印結點的數據內容

{

printf("該鏈表的內容是: ");

while (l->next)

{

printf("%d ", l->next->a);

l = l->next;

}

printf(" ");

}

void setList(list* l,int x,int y)

{

list* head = l;

l = l->next;

while (l)

{

if (l->a >=y || l->a <=x)//將結點的數據區與指定區域進行比較

{

head->next = l;//將滿足條件的結點連接在新表的最後一個結點

//指針後移

l = l->next;

head = head->next;

}

else

{

//不滿足的結點進行刪除

list* l1 = l;

l = l->next;

free(l1);

}

}

head->next = NULL;

}

int main()

{

list* l = (list*)malloc(sizeof(List));

newList(l);//初始化鏈表

printfList(l);//輸出舊表內容

setList(l,1,3);//進行修改

printfList(l);//輸出修改後的鏈表

//system("pause");

return 0;

}

(3)鏈表刪除c語言擴展閱讀

鏈表的特點

1、插入、刪除數據效率高,時間復雜度為O(1)級別(只需更改指針指向即可),隨機訪問效率低,時間復雜度O(n)級別(需要從鏈頭至鏈尾進行遍歷)。

2、和數組相比,內存空間消耗更大,因為每個存儲數據的節點都需要額外的空間存儲後繼指針。

常用的鏈表類型

1、單鏈表

1)每個節點只包含一個指針,即後繼指針。

2)單鏈表有兩個特殊的節點,即首節點和尾節點。用首節點地址表示整條鏈表,尾節點的後繼指針指向空地址null。

3)性能特點:插入和刪除節點的時間復雜度為O(1),查找的時間復雜度為O(n)。

2、循環鏈表

1)除了尾節點的後繼指針指向首節點的地址外均與單鏈表一致。

2)適用於存儲有循環特點的數據,比如約瑟夫問題。

3、雙向鏈表

1)節點除了存儲數據外,還有兩個指針分別指向前一個節點地址(前驅指針prev)和下一個節點地址(後繼指針next)。

2)首節點的前驅指針prev和尾節點的後繼指針均指向空地址。

④ C語言鏈表刪除

對於鏈表的訪問遍歷,最好是判斷表指針是否為NULL來決定是否繼續,如:
p=head ;
while( p != NULL ) //當結點指針不為空時,遍歷表,這要求建表時,尾結點的next=NULL!
{
printf("num=%d\n", p->num );
p=p->next ;
}
你自己調整一下自己的代碼吧,估計是刪除結點時,按個數訪問時,訪問到了NULL時,你還在操作結點指針。

⑤ 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語言中鏈表怎麼刪除結點

有分才有動力啊哥們。

刪除節點很簡單,以單鏈表為例,牢記三點

  1. 避免斷鏈,刪除掉節點後,前一個節點的p->next一定要指向後一個節點(如果是頭節點,記得要將新表頭P指向到原來的第二個節點。如果是尾節點,記得要將新的尾節點p->next置為NULL,)。

  2. 避免野指針,刪除掉節點後,p->next=NULL;

  3. 避免內存泄漏,刪除的節點,要用free釋放堆內存。

如果是雙向鏈表,不過是多了一個對prev操作,道理是一樣的。

⑦ C語言如何刪除鏈表頭節點

這種刪除方法是頭節點存放值的,這樣可以清楚的看到是否刪除掉了頭節點。

用p保存頭節點 p=head;

head指向下一個節點,成為新的頭節點head=p->next;

釋放原來的頭節點 free(p);


#include<iostream>
#include<stdio.h>
#include<stdlib.h>
voidprintList(structnode*head);
structnode*delHead(structnode*head);
structnode{
intdata;
structnode*next;
};
intmain(){
inti;
structnode*tail,*head,*p;
//尾插法插入數據
p=(structnode*)malloc(sizeof(structnode));
p->data=0;
tail=head=p;
tail->next=NULL;
for(i=1;i<10;i++){
p=(structnode*)malloc(sizeof(structnode));
tail->next=p;
p->data=i;
p->next=NULL;
tail=p;
}
printList(head);
head=delHead(head);
printList(head);
system("pause");
return0;
}
//刪除頭結點
structnode*delHead(structnode*head){
structnode*p=head;
head=p->next;
free(p);
returnhead;
}
//列印鏈表
voidprintList(structnode*head){
structnode*p=head;
while(p!=NULL){
printf("%i",p->data);
p=p->next;
}
printf(" ");
}

⑧ C語言鏈表刪除問題

所謂鏈表,就是用指針將內存中動態分配的結點空間,鏈接起來成一個表。
所以,建表的過程即是每次為新結點分配內存;因此,釋放空間的話,也要從頭到尾,一個一個結點的釋放,這樣才能全部釋放掉。
這段代碼釋放了整個鏈表空間內存;while循環的作用是從頭到尾釋放後續結點,如果直接free(pHead)則後面的結點將無法找到,那麼造成內存空間泄露。
另外,你的while循環存在一個錯誤,假設釋放了倒數第一個結點後,pHead指向最後一個結點,而最後一個結點的next為NULL,那麼這樣最後一個結點也沒有釋放掉,while就退出了。

⑨ c語言鏈表刪除

//找到節點,刪除以後,循環就應該結束。 void Delete(Node*head) { Node*p,*q;int x; p=head; q=head->next; scanf("%d",&x); while(q) { if(q->a==x) { p->next=q->next; free(p);//找到了節點刪除之後要退出循環 break; } else { p=q; q=q->next; } }

⑩ 如何刪除鏈表(C語言).

把頭節點拆下,把剩下的結點當兩個,第一個作為第一個,剩下的作為第二個,先刪除第一個,在刪除第二個,直到第二個為空

熱點內容
內存大小的存儲 發布:2025-01-22 18:58:17 瀏覽:393
tampermonkey腳本 發布:2025-01-22 18:53:17 瀏覽:117
windows7共享文件夾 發布:2025-01-22 18:53:17 瀏覽:478
如何調節安卓手機的內存 發布:2025-01-22 18:49:30 瀏覽:639
佳能相機存儲卡怎麼取消 發布:2025-01-22 18:40:59 瀏覽:569
天貓寶貝上傳 發布:2025-01-22 18:35:09 瀏覽:544
ipad如何登錄金鏟鏟安卓賬號 發布:2025-01-22 18:32:09 瀏覽:319
加密溝通 發布:2025-01-22 18:31:22 瀏覽:555
win7ftp用戶名和密碼設置 發布:2025-01-22 17:46:48 瀏覽:221
三表聯查的sql語句 發布:2025-01-22 17:27:13 瀏覽:418