Ⅰ 如何刪除鏈表中的某個元素
單向鏈表節點的一般形式:
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;
如此加上循環就能搜索鏈表中符合要求的元素並刪除。
Ⅱ 雙向鏈表的插入和刪除
//雙向鏈表的定義 public: TwoWayLinkedList():length(0),head(0),tail(0 case 2 : cout << "請輸入要插入的數據和插入位置:" ; cin >> ,xDplFj
Ⅲ 在一個雙向鏈表中,刪除*p結點的操作是
p->lnext->rnext=p->rnext;//p的前驅的後繼等於p的後繼;
p->rnext-lnext=p->lnext;//P的後繼的前驅等於P的前驅;
free(p);
總之,在刪除之前一定要把P的前驅後繼鏈連接好,再刪除
Ⅳ 雙鏈表中 查找到元素並刪除,為什麼么我的是死循環啊。請高手幫忙!
改成
while(p!=L) 雙鏈表沒有結尾NULL,所以p永遠不是0
Ⅳ 編寫演算法實現刪除雙向循環鏈表(線性表)中所有值為X的元素。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
Ⅵ python,刪除有序鏈表重復元素,為什麼沒通過
哎!你剛提問題沒多久,我就開始寫代碼,寫到現在,不採納真的是太對不起我了...
因為你沒有寫出具體的線性表,所以我假設該線性表是需要手動輸入的!
代碼如下運行通過:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*Sqlist;
void IniList(Sqlist *L) /*初始化*/
{
*L=(Sqlist)malloc(sizeof(Node));
(*L)->next=*L;
}
void Create_cLinkList(Sqlist L) /*尾插法建立鏈表*/
{
Node *s;
int c;
int flag=1;
bool bl;
L->data=NULL;
L->next=NULL;
while(flag)
{
bl=scanf("%d",&c);
if(bl)
{
s=(Node *)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}
else
{
flag=0;
}
}
}
void Treserve( Sqlist &L) /*比較鏈表中的每個數字,重復就刪除*/
{
Node *p;
Node *s;
s=p=L->next;
while(p->next!=NULL)
{
p=s;
p=p->next;
if(s->data==p->data)
{
if(p->next==NULL)
s->next=NULL;
else
s->next=p->next;
}
else
{
s=p;
}
}
}
main()
{
Sqlist la;
Node *p;
Node *s;
IniList(&la);
printf("輸入循環單鏈表A數據,按從小到大的順序輸入,輸入$符號結束:\n");
Create_cLinkList(la);
Treserve( la);
s=la;
p=la->next;
while(s->next!=NULL) /*輸出改變後的鏈表*/
{
printf("%d",p->data);
s=p;
p=p->next;
}
}