當前位置:首頁 » 網路管理 » 刪除表元為什麼要用輔助指針
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

刪除表元為什麼要用輔助指針

發布時間: 2022-07-13 17:34:01

❶ 為什麼要使用指針指針的好處在哪裡

指針的好處,需要和數組比較起來說。具體如下:
1.指針可以隨意申請不連續的數據存儲空間,而數組是連續的,如果數組空間沒有全部佔用,那麼會造成浪費,比如你申請了a[10],缺只有5個數據輸入,那麼會浪費掉5個數組空間。如果是指針就不會浪費,用多少申請多少。
2.指針的計算更快速。比如你需要計算一個16*16的矩陣消元,那麼數據會非常的多和大,你得申請足夠多的數組空間,弄不好還會造成溢出,為什麼?因為採用數組計算時,是數據的交換,而不是內存地址的交換。如果採用指針的話,不會浪費空間,不會溢出,因為指針計算時是交換指向數據存儲空間的地址,而不是交換數據。數據的大小比地址大得多。
所以採用指針好處多多,同樣指針也很危險,如果用不好,還不如用數組。得慢慢體會。謝謝。

❷ 請問下列程序在刪除節點時一定要用pt指針嗎

q->next=p->next;
free(p);
p=q->next;

這里你把p釋放了以後,p怎麼還能指向下一個節點?所以你要多定義一個節點來表示待刪除節點

1.我們必須知道對哪個鏈表進行操作,所以表頭指針head是必須知道的。

2.一般來說,待刪除的結點是由結點的數據確定的。然而我們還要操作待刪除結點之前的結點(或指針),以連接前後兩段鏈表。

3.令pGuard指針為待刪除結點的前趨結點指針。由於要對待刪除結點作內存釋放,需要有一個指針p指向待刪除結點。

4.如果待刪除結點為頭結點,則我們要操作表頭head,作為特殊情況處理。(你這里沒有考慮)

5.在刪除結點的過程中,仍然要始終保持所有的結點都在我們的控制范圍內,保證鏈表的完整性。為了達到這一點,我們還是採用先連後斷的方式:先把待刪除結點的前趨結點和它的後繼結點連接,再把待刪除結點與它的後繼結點斷開,並釋放其空間。

❸ 單鏈表的插入和刪除操作中,為什麼要用指向指針的指針

*next?前面一個結構體里的指針域中的指針指向下一個結構體變數

❹ 為什麼刪除結點,需要先生成一個指針指向前面一個結點

因為刪除的意思是讓節點不再鏈接到鏈表中。
如果讓前驅結點指向需要刪除結點之後就直接free該結點的話只是沒有了該結點堆內存的使用權,但結點內未指向空的指針可能還是指向鏈表中。
真正的刪除結點是讓前驅結點指向需要刪除結點之後將要刪除結點的next指針指向NULL,若後續需要用到該結點則可以先不free,若後續不需要用到則可直接free。

c語言銷--毀鏈表為什麼一定要用二級指針,新手求教

2種都是可以的.

只是二級指針會修改到頭節點.
Destroy(head);// 使用此法,此時head的地址沒有被設置成NULL
// Destroy(&head);// 使用此法,此時head的地址被設置成NULL

以下是測試代碼.

#include<stdio.h>
#include<stdlib.h>
struct StuNode{
int a;
struct StuNode *next;
};
void Destroy(struct StuNode **ph) /*直接用*h的話*/
{
struct StuNode*p;
p=*ph;/*如果直接用p=h不行嗎?*/
while(p!=NULL)
{
*ph=p->next;
free(p);
p=*ph;
}
printf("已刪除\n");
*ph=NULL;
}
void Destroy(struct StuNode *h)
{
struct StuNode*p;
p=h;
while(p!=NULL)
{
h=p->next;
free(p);
p=h;
}
printf("已刪除\n");
h=NULL;
}
void main()
{
int i;
struct StuNode *head;
struct StuNode *p = (struct StuNode*)malloc(sizeof(struct StuNode));
p->a =0;
p->next = NULL;
head = p;
for(i=1;i<4;i++)
{
p->next = (struct StuNode*)malloc(sizeof(struct StuNode));
p->next->next=NULL;
p=p->next;
p->a = i;
}
Destroy(head);// 使用此法,此時head的地址沒有被設置成NULL
// Destroy(&head);// 使用此法,此時head的地址被設置成NULL
}

❻ 求助,什麼叫鏈表的輔助表元

是指鏈表的表頭,有的鏈表沒有表頭,鏈表用表首元節點表示,有的有表頭,裡面存有一個Head和一個tail指針,用表頭表示鏈表,通過Head訪問鏈表

❼ 為什麼在鏈表的刪除或者插入的操作中要用二級指針

你好,其實這個問題我當時也迷糊了,後來想想其實也不難,呵呵,我們分析一下:
如果用C語言描述單鏈表如下:
typedef struct node{
DataType data;//節點的數據域
struct node *next;//節點的指針域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;//p是節點
LinkList head;//head是頭指針
注意最後一句:"LinkList head",這是定義了一個頭結點,前面已經用typedef定義了LinkList,既「typedef ListNode *LinkList;」這句,這就說明LinkList head 定義後 head實際上是一個LinkNode類型的指針,這是我們單單看最後兩句的定義而忽略其字面意思而言的話,p和head實際上是同一種類型的變數,都是ListNode類型的指針,只不過最後一句LinkList類型是用typedef定義的,所以沒有「*」號。
因為刪除或者插入操作有時會修改實參的指針(比如頭結點為空的時候插入節點,這是就修改了頭結點),那麼就必須將相應的形參說明為指針的指針,函數電泳時將實參指針的地址傳遞給相應的形參。例如:剛剛初始化的時候頭結點head為空,如果這時插入節點p(由上可知p是ListNode*類型的,是個指針,把它當做地址)時應該是head=p;這就改變了head的地址,所以在傳參數的時候,函數的形參一般都是"Insert(LinkList *head,DataType x)",
注意:head是ListNode*類型的,所以*head 是ListNode**類型的,不知道我說的樓主認為可以嗎?

❽ 在順序線性表中刪除元素

樓主糾結的其實就是一個問題:指針運算到底是怎麼計算的?其實這取決於指針的類型。舉個例子,int *p,則p=p+1表示將指針p移動1個int長度(也就是4個位元組);如果是char *p,則p=p+1表示指針p移動一個char長度(也就是1個位元組)。而到底移動多少個位元組,是由編譯器通過指針的類型來決定的。所以你的問題中,L.elem+L.length-1自然就是移動到最後一個元素了。

有問題歡迎追問!