当前位置:首页 » 网络管理 » 删除表元为什么要用辅助指针
扩展阅读
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自然就是移动到最后一个元素了。

有问题欢迎追问!