为什么无法删除结点?

本人新手菜鸟一个,刚学数据结构,,写了一道单链表的删除操作问题的题,语法没有错,
就是起不了删除低i-1个结点的作用,感觉思路也没有错啊。。。有没有哪位大神能够指点指点,感激不尽,,,,
#include
#include
typedef struct linknode{
int data;
struct linknode *next;
}linknode;
void initlist(linknode *&l){
l=(linknode *)malloc(sizeof(linknode));
l->next=NULL;
}
void createlist(linknode *&l){
linknode *r,*s;
l=(linknode *)malloc(sizeof(linknode));
r=l;
int n,j;
scanf("%d",&n);
for(int i=0;i s=(linknode *)malloc(sizeof(linknode));
scanf("%d",&j);
s->data=j;
r->next=s;
r=s;
}
r->next=NULL;
}
bool deletelist(linknode *&l){
linknode *p=l,*q;
int i;
scanf("%d",&i);
if(i return false;
for(int j=0;j p=p->next;
}
q=p->next;
while(q!=NULL&&q->next!=NULL){
p->next=q->next;
free(q);
return true;
}
}
void destroy(linknode *&l){
linknode *pre=l,*p=l->next;
while(p!=NULL){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
void display(linknode *&l){
linknode *p=l->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
int main(){
linknode *l;
initlist(l);
createlist(l);
deletelist(l);
display(l);
destroy(l);
return 0;
}

存在一个错误,导致删除操作不能按照预期执行。具体来说,问题出在 deletelist 函数中,代码如下:


while(q!=NULL&&q->next!=NULL){
    p->next=q->next;
    free(q);
    return true;
}

这段代码的逻辑是在找到要删除的结点的前一个结点 p 后,将 p 的 next 指针指向要删除结点的后一个结点 q->next,然后释放 q 所指向的结点。但是在这段代码的最后,你使用了 return true;,这会导致函数在删除第一个满足条件的结点后就直接返回了,而没有继续删除后面的结点。因此,你需要将 return true; 移到循环外面:


while(q!=NULL&&q->next!=NULL){
    p->next=q->next;
    free(q);
    q=p->next;
}
return true;