當前位置:首頁 » 操作系統 » 刪除演算法鏈表

刪除演算法鏈表

發布時間: 2022-08-26 05:33:55

A. 單鏈表刪除操作

// 刪除節點,釋放內存空間
p->next = p->next->next;
delete p->next;
******************************************
若鏈表為:
鏈表節點 | 1 | 2 | 3 |...
對應指針 | p | p->next | p->next->next|...

你想刪除節點2(p->next),
但你的做法是:
p->next = p->next->next;(1的下一個由指向2改為指向3);
鏈表節點 | 1 | 2 | 3 |...
對應指針 | p | | p->next |...
delete p->next;(刪除3)
這就錯了,若要刪除必須先將被刪的節點2保存給臨時變數,修改鏈表後再刪除。正確的做法是:
linkList* tmp = NULL;
...
tmp = p->next;
p->next = p->next->next;
delete tmp;

另外,while (p && cnt != location - 1)這種寫法雖然正確,但很不規范且危險,容易出現優先順序和默認值的疏忽。

關於你補充的問題,不分析你的代碼了,直接給你重寫一個吧,看懂了就可以自己改了。
void Sort(linkList* L)
{
bool done_flag = FALSE;
linkList* p = L;
linkList* temp = NULL;

if (p->next == NULL)
{
return;
}

/*你的鏈表結構存在獨立首節點,所以p可以直接做兩個交換節點的父節點*/

/*若未發現亂序,說明已經排好*/
while(!done_flag)
{
done_flag = TRUE;

/*遍歷鏈表 保證p下至少存在兩個節點*/
while(p->next->next != NULL)
{
/*若順序錯誤則對換*/
if (p->next->name[0] > p->next->next->name[0])
{
/*存在亂序*/
done_flag = FALSE;

/*鏈表:p p1 p2 p3*/
/*交換p1 p2*/

/*temp 指向 p1*/
temp = p->next;

/*p 的下一個改為 p2*/
p->next = p->next->next;

/*將 p3掛到p1後面,此時p的下一個是p2,所以p的下一個的下一個是p3,temp此時為p1*/
temp->next = p->next->next;

/*p 的下一個此時為 p2,將p2的下一個指向 temp(p1)*/
p->next->next = temp;
}

/*p後移*/
p = p->next;
}
}
}

bool你那裡有問題的話,可以改為int或char。

結題吧。

B. C++數據結構鏈表刪除演算法中,del=first;first=first->link;delete del;是什麼意思(尤其是第二句)

first是頭指針,第一句讓del指向首節點;,第二句是讓first指向第二個節點,把第一個節點的指針域賦給first,而這個指針域指向第二個節點,故就是讓first指向第二個節點;第三句,進行刪除操作;這三句這應該在一個循環內,至此,此題已解,呵呵

C. 順序表、單鏈表的刪除演算法

第三個位置的數的下標是2。如果順序表最開始是12345,length等於5,那刪除第三個位置的數後順序表就變成了12455,而length變成了4,有效數據當然是1245。

D. 試編寫一個在循環雙向鏈表中進行刪除操作的演算法,要求刪除的結點是指定結點p的前趨結點(自己創建鏈表)

要刪除p節點的前驅,先定義一個節點q為p的前驅節點。有如下關系:
q->pre->next=p;
p->pre=q->pre;
然後刪除q節點就可以了。

# include <iostream.h>
# include <assert.h>

template <class Type>
struct DbNode
{
Type data;
DbNode<Type> *next,*pre;

DbNode(DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):next(ptr1),pre(ptr2)
{}
DbNode(Type x,DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):data(x),next(ptr1),pre(ptr2)
{}
};

template <class Type>
class DbList
{
public:
DbList()
{
head = new DbNode<Type>;
head->pre = head->next = head;
}

DbList(const DbList<Type> &dl)
{ }

~DbList()
{
Destory();
}
public:
void DeleteNode(DBNode<Type> *p)
{
DBNode<Type> *q=p->pre;

q->pre->next=p;
p->pre=q->pre;
delete q;
}

private:
DbNode<Type> *head;

void Destory()
{
DbNode<Type> *p = head->next;
while(p != head)
{
head->next = p->next;
p->next->pre = head;
delete p;
p = head->next;
}
}
};

E. 線性鏈表刪除元素演算法

#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int num; /*指數*/
struct node *next; /*指向下一個結點的指針*/
} *listnode;
void InitList(listnode L) /*初始化單鏈表*/
{
L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立頭結點*/
L->next=NULL;
}
太扣了 一分也不給 但是我就是那種樂於助人的人 告訴不初始化 鏈表 接下來的 你要是給分我就給你寫

F. 單鏈表的刪除演算法,為什麼這道題選A而不選c呢求告知多謝!!!

C選項最後那句是free(q),但是我們要刪除的是結點A,而不是A的下一個結點
A選項,把p的數據換成了下一個結點的數據,達到刪除的目的,而同時下一個結點q就沒有用了,那最後要free(q)

G. 求助C語言 單鏈表的插入、刪除演算法 的一些問題

第一個問題和第三個問題都是引用的意思,就是在函數中改變該變數的值會影響調用的地方的值,同時這樣如果是大的對象,不是復制一個值而是原來的變數,只是一個別名。
第二個問題&&是與的意思,也就是說當p指針不為空並且j < i-1時候執行循環
最後一個三句話意思是刪除一個元素,在此處刪除的是指針q指向的元素,用q指向要刪除的元素,然後第二句話是讓當前指針的下一個元素指向q的下一個元素,也就是刪除了q,然後把要刪除的元素的值也就是data賦給e變數
不知道解釋清楚了沒有,要是不行再聯系我。

H. 用循環單鏈表實現循環隊列,如何寫出插入和刪除的演算法

typedef struct CircleListNode{

Datatype d;

struct CircleList *pre,*nxt;

}*CircleList,CirListNode;

typedef struct

{

CircleList Head;

int num;

}CircleQueue;

void insertFront(CircleList *L,d);

{

if(!L)return NULL;

if(*L==NULL)

{

*L=(CircleList) malloc(sizeof(CirListNode));

*L->nxt= *L->pre=*L ;

*L->d=d;

}

else

{

CircleList p =(CircleList) malloc(sizeof(CirListNode));

p->nxt=*L;

p->pre=*L->pre;

*L->pre->nxt=p;

*L->pre=p;

*L=p;

}

}

I. 鏈表插入(刪除)一個節點的演算法

publi void deleteInO1(Node head,Node t){
if (head == null || t == null)
return;
if (t.next != NULL) {
Node tmp = t.next;
t.next = tmp.next;
t.val = tmp.val;
}
else { //待刪除節點為尾節點
Node tmp = head;
while(tmp.next != t)
tmp = tmp.next;
tmp.next = NULL;
}
}

J. 設計一個在帶頭結點的單鏈表中刪除第i個結點的演算法

//刪除節點 刪除第i個節點
int Delete_Positon_LL(LinkList *phead,int i)
{
LinkList p,q;//p為值是x的節點,q是p的前一個節點
int j;

if((*phead)->next == NULL)//如果鏈表為空,做下溢處理
{
printf("單鏈表為空! ");

return 0;
}
if(i == 1) //如果是表頭,表頭後移
{

p=(*phead)->next;
(*phead)->next=(*phead)->next->next;
free(p);//釋放表頭


(10)刪除演算法鏈表擴展閱讀:

鏈接方式存儲的線性表簡稱為鏈表(Linked List)。鏈表的具體存儲表示為:

① 用一組任意的存儲單元來存放線性表的結點(這組存儲單元既可以是連續的,也可以是不連續的)

② 鏈表中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關系,在存儲每個結點值的同時,還必須存儲指示其後繼結點的地址(或位置)信息(稱為指針(pointer)或鏈(link))

鏈式存儲是最常用的存儲方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的數據結構。

熱點內容
編程找點 發布:2025-05-15 20:43:10 瀏覽:587
php上傳臨時文件夾 發布:2025-05-15 20:43:00 瀏覽:657
impala資料庫 發布:2025-05-15 20:42:12 瀏覽:649
android安裝插件 發布:2025-05-15 20:41:31 瀏覽:241
神秘顧客訪問 發布:2025-05-15 20:33:39 瀏覽:298
安卓市場手機版從哪裡下載 發布:2025-05-15 20:17:28 瀏覽:815
幼兒速演算法 發布:2025-05-15 20:15:08 瀏覽:87
best把槍密碼多少 發布:2025-05-15 20:13:42 瀏覽:549
android安裝程序 發布:2025-05-15 20:13:20 瀏覽:560
c語言跳出死循環 發布:2025-05-15 20:06:04 瀏覽:825