『壹』 無頭結點的單鏈表的插入刪除操作應注意什麼比如是否要注意插入刪除的位置等
無頭結點的單鏈表,由頭指針(Head)指向第一個節點,當鏈表為空時,這個指針為空。
在插入時,
如果是插入第一個節點位置,則插入節點的Next = Head,然後Head = 插入節點;
否則取插入位置前一個節點PreNode,插入節點的Next = PreNext->next,PreNext->Next = 插入節點
在刪除時,
如果是刪除第一個節點,則Head = 刪除節點->Next;
否則取刪除位置前一個節點PreNode,PreNode->Next = 刪除節點->Next.
『貳』 關於鏈表尾節點的刪除操作
問題出現在查找效率上
鏈表最常用的操作是在末尾插入節點和刪除尾節點
在尾巴插入刪除操作:
都需要知道他的前導而單鏈表要查找到最有一個元素需要遍歷全部鏈表
雙鏈表直接可以查到前導
最常用的操作實在最後一個元素之後插入一個元素和刪除第一個元素
刪除頭結點需要頭指針或者只用一個->next域就能查到速度就快了
在有第二個條件刪除最後一個元素有尾指針就最好了可以直接找到尾巴元素同時他還是循環鏈表所以正好他的->next就是頭結點
ok?
『叄』 如何刪除鏈表
單向鏈表節點的一般形式:
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;
如此加上循環就能搜索鏈表中符合要求的元素並刪除。
『肆』 c++ 鏈表 刪除各種情況節點問題。。。。求教。。在線等。。。
一、結尾節點無法刪除的問題,你可以想像一個只有三個節點的鏈表,結尾節點的ID=findid,開始時,p指向第二個節點,然後執行到第一個if時,由於p->next->ID==findid,於是執行第二個if語句,但是此時p->next->next是等於NULL的,所以刪除節點的代碼沒被執行。
二、當只有一個結點時,因為一開始定義p=head->next,所以一開始p=NULL,當執行到第一個if時,p->next->ID的對象是不存在的,故出錯;當只有兩個節點時,同上,只是這時候變成一開始時p->next是為NULL的,所以p->next->ID也是不存在的,也會出錯。
當你寫程序時,最好是畫出一個個節點的圖畫,把一個個指針放到各自的位置進行操作,這樣出錯率會低很多。下面是我寫的刪除節點的代碼:
studentnode
*p1,*p2;
//p1用來指向後一個節點,p2用來指向前一個節點
if(
(head->next=NULL){
if(head->ID==findid)
delete
head;
//當只有一個結點且該結的該刪時
else
return
0;
}
else{
//默認一條鏈表裡有可能不止一個該刪的結點
p2=head;
p1=head->next;
do{
if(p1->ID==findid){
//刪除結點,把p1,p2推後
p2->next=p1->next;
delete
p1;
p1=p2->next;
}
else
{
p2=p1;
p1=p1->next;
}
//沒發現該刪節點時,把p1,p2推後
}while(p1!=NULL)
return
0;
}
『伍』 C語言的單向鏈表刪除節點的問題
偽代碼:
if node.age ==30
delete(node)
delete是封裝好了的代碼
刪除一個節點的步驟:
如我有一個鏈表:A B C D 四個元素
我要刪除B,則有
p =A.next
A.next = p.next
free(p)
主要是思想對就行,一定要封裝
你這個屬於那種在線刪除
就是先查找,如果符合條件,就刪除。
刪除操作,必須知道有刪除的節點的前一個節點的地址才行。
那麼你應該每次查找的時候不是判斷當前節點是否符合要求,而是判斷下一個節點。如果符合就按照刪除節點的刪除來。
刪除操作的三部曲:
第一步:保存刪除節點的地址
第二步:將刪除節點的前一個節點的指針域指向刪除節點的下一個
第三部:free 需要刪除節點
我現在直接在這里寫代碼了
void del(head,age)
{
p = head;
while(p)
{
if( p->next && p->next->age == age )//刪除操作的三步曲
{
q=p->next;
p->next = q ->next;
free(q);
}//end if
p = p->next;
}//end while
}
代碼就是這樣的。很簡單。這段代碼並不能編譯,你加上類型就好了。我強調的是方法。
『陸』 刪除節點(鏈表)
void
del(list
l){//這么個函數請大俠指教,刪除頭節點總是失敗(原因見下)
node
*p,*q;
char
name[12];
不能向p分配
gets(name);
p=l;
while
(strcmp(name,p->name)
&&
p->next!=null)//循環查找
{
q=p;
p=p->next;
}
if(!strcmp(name,p->name))
{
if(p==l)
l=p->next;//刪頭節點,跟蹤到這,l確實指向下一節點
else
q->next=p->next;//中間節點
printf("刪除記錄成功。\n");
不能釋放p。。。。l是指向p的
}//