m0_62138486 2022-06-08 11:51 采纳率: 98.6%
浏览 20
已结题

代码运行正确,有几条语句不太明白

为什么删除结点需要借助三个辅助结点 并且还使用了pre前驱节点以及q的作用是什么?求解答,感谢

img

img


#include <stdio.h>
struct stud_node{
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *Creat_Stu_Doc();
struct stud_node *DeleteDoc(struct stud_node *head,int min_score);
void Ptrint_Stu_Doc(struct stud_node *head);
int main(){
struct stud_node *head;
head = Creat_Stu_Doc();
int x;
scanf("%d",&x);
head = DeleteDoc(head,x);
Ptrint_Stu_Doc(head);
return 0;
}
//思路就是用带头结点的尾插法建立链表,然后删除节点,最后输出。
struct stud_node *Creat_Stu_Doc()
{
struct stud_node *head,p,tail;
int x;
head = (struct stud_node
)malloc(sizeof(struct stud_node));
head->next = NULL;//千万记得给头结点初始化后继节点为NULL
tail = head;
scanf("%d",&x);
while(x != 0)
{
p = (struct stud_node
)malloc(sizeof(struct stud_node));
p->next = NULL;
p->num = x;
scanf("%s%d",p->name,&p->score);
tail->next = p;//给尾插啊!毕竟尾插法
tail = p;
scanf("%d",&x);
}
tail->next = NULL;
return head;
}
struct stud_node *DeleteDoc(struct stud_node *head,int min_score)
{
struct stud_node *p,*q,pre;
//pre为p的前驱节点
p=head->next;
pre=head;
while(p != NULL)
{
if(p->score<min_score)
{
q=p;
p=p->next;
pre->next = p;
free(q);
}
//需要3个辅助节点 pre指向
p的前驱节点,若p所指向的值小于min_score,则删除p(此时借用q来实现删除操作)。
else
{
pre=p;
p=p->next;
}
//若p不小于min_score,让pre和p后移。
}
return head;
}
void Ptrint_Stu_Doc(struct stud_node *head)
{
struct stud_node *p;
for(p=head->next; p != NULL; p = p->next)
{
printf("%d %s %d\n",p->num,p->name,p->score);
}
}

  • 写回答

1条回答 默认 最新

  • 於黾 2022-06-08 13:21
    关注

    首先,你这是一个链表
    链表不是顺序表,你只能通过next去找到它的下个节点的地址
    当你要删除链表中的一项,你需要将它的上一项指向它的下一项,让链表不要断掉
    那么你至少需要上个节点的地址,本节点地址,下个节点的地址
    其中下个节点可以直接用本节点.next访问,所以这里只需要2个指针,pre和p
    由于最后要删除掉本节点,那么当本节点的指针移动了,就删错节点了,所以需要一个额外的指针先记录下本节点的地址,q就是用来记录的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月23日
  • 已采纳回答 6月15日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 vivo手机锁屏密码忘记了需要手机里的资料在百度里搜可以用ADB命令希望帮帮我
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出