㈠ c語言刪除鏈表節點出現問題
看不到你的代碼,不知道發生了什麼。我估計是破壞了鏈表的next指針,導致死循環了吧。
㈡ C語言中鏈表怎麼刪除結點
有分才有動力啊哥們。
刪除節點很簡單,以單鏈表為例,牢記三點
避免斷鏈,刪除掉節點後,前一個節點的p->next一定要指向後一個節點(如果是頭節點,記得要將新表頭P指向到原來的第二個節點。如果是尾節點,記得要將新的尾節點p->next置為NULL,)。
避免野指針,刪除掉節點後,p->next=NULL;
避免內存泄漏,刪除的節點,要用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語言版)中的刪除鏈表中的一個節點
代碼如下:
#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;
}
(4)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語言的單向鏈表刪除節點的問題
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);