单链表结点删除为啥不能进行q=p->next;
时间: 2023-03-30 16:03:15 浏览: 68
这是因为在单链表中,删除一个结点需要知道该结点的前驱结点,而p->next只是指向该结点的后继结点,无法直接获取前驱结点。因此,需要在删除结点时,先找到该结点的前驱结点,然后将其指向该结点的后继结点,才能完成删除操作。
相关问题
单链表结点删除为啥不能先进行q=p->next;
这是因为在单链表中,删除一个结点需要先找到它的前驱结点,将前驱结点的指针指向它的后继结点,然后再删除该结点。如果直接使用q=p->next,那么删除的就是p的后继结点,而不是p本身,这样就无法将p的前驱结点的指针指向p的后继结点,导致链表出现错误。因此,在删除单链表中的结点时,必须先找到要删除结点的前驱结点,才能正确地删除该结点。
下面是在单链表中删除值相同的多余结点的核心代码,请将其程序补充完整。 typedef int datatype; typedef struct node { 第一空 data; struct node *next; }lklist; void delredundant(lklist *& head) { lklist *p,*q,*s; for(p=head;p!=0;p=p->next) { for(q= 第二空 ,s=q;q!=0; ) if (q->data==p->data) {s->next=q->next; free(q);q=s->next;} else { 第三空 ,q=q->next;} } }
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
} lklist;
void delredundant(lklist *& head) {
lklist *p, *q, *s;
for (p = head; p != 0; p = p->next) {
for (q = p->next, s = p; q != 0; ) { // s指向q的前一个节点
if (q->data == p->data) {
s->next = q->next; // 将s的下一个节点指向q的下一个节点
free(q); // 释放q节点的空间
q = s->next; // q指向下一个节点
} else {
s = q; // s指向q
q = q->next; // q指向下一个节点
}
}
}
}
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)