刪除演算法鏈表
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))
鏈式存儲是最常用的存儲方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的數據結構。