C語言中如何實(shí)現(xiàn)單鏈表刪除指定結(jié)點(diǎn)
單鏈表刪除指定結(jié)點(diǎn)
在單鏈表中刪除指定的結(jié)點(diǎn)。這里單鏈表是用尾插法建立的,因?yàn)槲膊宸ㄝ敵龅捻樞蚺c輸入的順序是相同的。
#include <bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}no;
int main()
{
no *head,*tail,*p,*r,*q;
head=new no;
head->next=NULL;
tail=head;
int n,k;
printf("一共要輸入的數(shù): ");
scanf("%d\n",&n);
//尾插法建立單鏈表
for(int i=0;i<n;i++)
{
cin>>k;
p=new no;
p->data=k;
p->next=NULL;
tail->next=p;
tail=p;
}
//接下來是刪除操作
int m;
printf("輸入要?jiǎng)h除的數(shù): ");
scanf("%d",&m);
p=head;//讓p指針從頭結(jié)點(diǎn)開始遍歷,要注意的是,頭結(jié)點(diǎn)是沒有數(shù)值的哦!
while(p->data!=m&&p->next!=NULL)//循環(huán)查找要?jiǎng)h除的結(jié)點(diǎn)
{
r=p;
p=p->next;//把p的下一個(gè)結(jié)點(diǎn)給p,所以p就不是原來的p了,原來的p變成了r
if(p->data==m)//因?yàn)轭^結(jié)點(diǎn)沒有數(shù)值,所以一開始就讓p=p->next是對(duì)的
{
r->next=p->next;//將要?jiǎng)h除結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)指向它的下一個(gè)結(jié)點(diǎn)(原本是要指它的,現(xiàn)在指向它的下一個(gè)結(jié)點(diǎn)了)(r是要?jiǎng)h除結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn))
delete(p);
}//注意,這里的p->next已經(jīng)和第38行的p->next不一樣了,它是38行的下一個(gè)結(jié)點(diǎn)了
}
q=head->next;
for(int i=0;i<n-1;i++)
{
printf("%d ",q->data);
q=q->next;
}
return 0;
}測試一:一共要輸入的數(shù):5
1 2 3 4 5
要?jiǎng)h除的數(shù):5
輸出:1 2 3 4
測試二:一共要輸入的數(shù):5
1 2 3 4 5
要?jiǎng)h除的數(shù):1
輸出: 2 3 4 5
測試三:一共要輸入的數(shù):5
1 2 3 4 5
要?jiǎng)h除的數(shù):2
輸出:1 3 4 5
鏈表的刪除結(jié)點(diǎn)(各種方法)
先建立鏈表(代碼在最后)
鏈表中刪除第i個(gè)結(jié)點(diǎn)
int main()
{
? ? int i;
? ? Node *p,*head,*k;
? ? head=setlink();
? ? scanf("%d",&i);
? ? int v=1;
? ? for(p=head->next;p!=NULL;k=p,p=p->next) ?
? ? {
?? ??? ?if(v==i)break;
?? ??? ?else{
?? ??? ??? ?v++;
?? ??? ?}
?? ??? ? ??
? ? }
?? ??? ?k->next=p->next;
?? ?
?? ? delete(p);
?? ? ? ?for(p=head->next;p!=NULL;p=p->next)
?? ??? ? ? printf("%d ",p->id);
?? ? return 0 ;
}刪除與鏈表中與a相同的結(jié)點(diǎn)
int main()
{
?? ?int a;
?? ?Node *p,*q,*heada,*k;
?? ?heada=setlink();
?? ?scanf("%d",&a);
?? ?for(p=heada->next;p!=NULL;k=p,p=p->next) ?
?? ?{
?? ??? ?if(p->id==a)
?? ??? ?{
?? ??? ??? ?q=p;
?? ??? ??? ?k->next=p->next;
?? ??? ??? ?p=k->next;
?? ??? ??? ?delete(q);
?? ??? ?}
?
?? ?}
?? ?for(p=heada->next;p!=NULL;p=p->next)
?? ??? ?printf("%d ",p->id);
?? ?return 0 ;
}刪除鏈表中重復(fù)元素
int main()
{
?? ?Node *p,*q,*heada,*k,*ptr;
?? ?heada=setlink();
?? ?for(p=heada->next;p!=NULL;p=p->next) ?
?? ?{
?? ??? ?k=p;
?? ??? ?for(q=p->next;q!=NULL;k=q,q=q->next)
?? ??? ?{
?? ??? ?if(p->id==q->id)
?? ??? ?{
?? ??? ??? ?ptr=q;
?? ??? ??? ?k->next=q->next;
?? ??? ??? ?q=k;
?? ??? ??? ?free(ptr);
?? ??? ?}
?? ??? ?}
?? ?}
?? ?for(p=heada->next;p!=NULL;p=p->next)
?? ??? ?printf("%d ",p->id);
?? ?return 0 ;
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++ 對(duì)數(shù)器實(shí)現(xiàn)示例
對(duì)數(shù)器用于在自己的本地平臺(tái)驗(yàn)證算法正確性,本文詳細(xì)的介紹了c++ 對(duì)數(shù)器實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別
函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值2022-08-08
詳解C語言數(shù)據(jù)結(jié)構(gòu)之棧
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)之棧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
詳解C語言中scanf函數(shù)使用的一些注意點(diǎn)
這篇文章主要介紹了C語言中scanf函數(shù)使用的一些注意點(diǎn),scanf函數(shù)的使用是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-04-04
QT5實(shí)現(xiàn)簡單的TCP通信的實(shí)現(xiàn)
本文主要介紹了QT5實(shí)現(xiàn)簡單的TCP通信的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法
這篇文章主要介紹了C++中const_cast與reinterpret_cast運(yùn)算符的用法,經(jīng)常被用于表達(dá)式中的類型轉(zhuǎn)換,需要的朋友可以參考下2016-01-01

