六堰飞鱼 2024-03-13 10:27 采纳率: 100%
浏览 2
已结题

代码为什么加break才能输出结果?


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LA 4
#define LB 5
struct student{
    int num;
char name[8];
struct student * next ;
}
a[LA],b[LB];
int main() {
    struct student *create(struct student *, int);
    struct student *del(struct student*, struct student*);
    void print(struct student*);
    struct student a[LA]={{101,"Wang"},{102,"Li"},{105,"Zhang"}, {106,"Wei"}};
    struct student b[LB]={{103,"Zhang"},{104,"Ma"}, {105,"Chen"},{107,"Guo"},{108,"1ui"}};
    struct student *headA= create(a, LA), *headB = create(b, LB), *p;
    p = del(headA, headB);
    print(p);
    return 0;
}

//创建
struct student *create(struct student *h, int n) {
    struct student *p, *s, *head;
    head = NULL;
    int i = 0;
    s = (struct student*) malloc(sizeof(struct student));
    p = (struct student*) malloc(sizeof(struct student));
    p->next = NULL;
    head = p;
//    尾插法
    do{
        s->num = h[i].num;
        strcpy(s->name, h[i].name);
        p->next = s;
        p = s;
        s = (struct student*) malloc(sizeof(struct student));
        i++;
    } while (i<n);
    p->next = NULL;
    return (head);
}

//删除
struct student *del(struct student* a, struct student* b){
    struct student *p = a->next, *q = b->next, *pre;
    while (q != NULL) {
        if( p == NULL) {
            p = a->next;
            q = q->next;
        }
        if(p->num == q->num) {
            pre->next = p->next;
            p = pre->next;
            q = q->next;
            break;//求问:为什么这里要break出去才能获得数据?
        }
        pre = p;
        p = p->next;
    }
    return (a);
}

//输出
void print(struct student* head) {
    struct student *p = head->next;
    while (p!=NULL) {
        printf("%d ", p->num);
        p = p->next;
    }
}

img

就是删除函数中

if(p->num == q->num)

语句,要加break才能得到数据,否则就输出为空,不知道是什么原因?

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 2024-03-13 10:27
    关注

    六堰飞鱼 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    原因: 在删除函数中,当找到匹配的节点时,需要删除该节点并继续向后查找其他匹配的节点。但是如果没有加上break语句,会导致循环继续执行,继续查找匹配的节点,此时pre指向的是已删除节点的前一个节点,而p指向的是已删除节点的下一个节点,因此会跳过被删除的节点,导致最终输出结果为空。

    解决方案:

    1. 在找到匹配节点后,加上break语句,跳出循环,继续执行后续代码。

    修改后的代码如下:

    //删除
    struct student *del(struct student* a, struct student* b){
        struct student *p = a->next, *q = b->next, *pre;
        while (q != NULL) {
            if( p == NULL) {
                p = a->next;
                q = q->next;
            }
            if(p->num == q->num) {
                pre->next = p->next;
                p = pre->next;
                q = q->next;
                **break;**
            }
            pre = p;
            p = p->next;
        }
        return (a);
    }
    
    1. 不使用break语句,而是在删除节点后将pq分别向后移动一位,继续查找匹配的节点。

    修改后的代码如下:

    //删除
    struct student *del(struct student* a, struct student* b){
        struct student *p = a->next, *q = b->next, *pre;
        while (q != NULL) {
            if( p == NULL) {
                p = a->next;
                q = q->next;
            }
            if(p->num == q->num) {
                pre->next = p->next;
                p = p->next;
                q = q->next;
            }
            else {
                pre = p;
                p = p->next;
            }
        }
        return (a);
    }
    

    以上两种方案都可以正确输出结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据