ohhhhhhhhhhhhhhhhhh 2022-11-15 20:53 采纳率: 71%
浏览 7
已结题

删除单链表偶数节点代码里哪里有问题?

img


pta上提交后显示有三个段错误是哪里错啊?


#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode *head;

    head = createlist();
    head = deleteeven(head);
    printlist(head);

    return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode *createlist(){
    struct ListNode *head,*q,*t;
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    q = head;
    int a;
    while(scanf("%d",&a),a != -1){
        t = (struct ListNode*)malloc(sizeof(struct ListNode));
        t->data = a;
        q->next = t;
        q = t;
    }
    q->next = NULL;
    return head->next;
}
struct ListNode *deleteeven( struct ListNode *head ){
    struct ListNode *q,*p;
    while(head->data % 2 == 0 && head) head = head->next;
    if(head == NULL) return NULL;
    q = head;
    p = q->next;
    while(p->next){
        p = q->next;
        if(p->data % 2 == 0){
            q->next = p->next;
        }
        else q = q->next;
    }
    return head;
}
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-11-15 22:54
    关注

    题主的代码里,如果输入的全是偶数,执行struct ListNode *deleteeven()函数时出错。修改如下,供参考:

    #include <stdlib.h>
    #include <stdio.h>
    struct ListNode {
        int data;
        struct ListNode *next;
    };
    struct ListNode *createlist();
    struct ListNode *deleteeven( struct ListNode *head );
    void printlist( struct ListNode *head )
    {
         struct ListNode *p = head;
         while (p) {
               printf("%d ", p->data);
               p = p->next;
         }
         printf("\n");
    }
    int main()
    {
        struct ListNode *head;
        head = createlist();
        head = deleteeven(head);
        printlist(head);
        
        return 0;
    }
    /* 你的代码将被嵌在这里 */
    struct ListNode *createlist()
    {
        struct ListNode *head = NULL,*q = NULL,*t;
        int a;
        while(scanf("%d",&a),a != -1){
            t = (struct ListNode*)malloc(sizeof(struct ListNode));
            t->next = NULL;
            t->data = a;
            if (!head)
                head = t;
            else
                q->next = t;
            q = t;
        }
        return head;
    }
    struct ListNode *deleteeven( struct ListNode *head )
    {
        struct ListNode *q,*p = NULL;
        q = head;
        while(q)
        {
            if(q->data % 2 == 0)
            {
                if (!p){
                    head = head->next;
                    free(q);
                    q = head;
                }
                else{
                    p->next = q->next;
                    free(q);
                    q = p->next;
                }
            }
            else{
                p = q;
                q = q->next;
            }
        }
        return head;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分