qq_55962103 2021-04-22 20:37 采纳率: 100%
浏览 55
已采纳

本题要求实现两个函数

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

函数接口定义:struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

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

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

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

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}

/* 你的代码将被嵌在这里 */

struct ListNode *readlist()
{
    struct ListNode *head,*tail,*p;
    int number;
    
    head=tail=NULL;
    do{
        scanf("%d",&number);
        if (number!=-1)
        {
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            p->data=number;
            p->next=NULL;
            if (head==NULL)
            {
                head=tail=p;
            }
            else {
                tail->next=p;
                tail=p;
            }
        }
    }while(number!=-1);
    return head;
}

struct ListNode *getodd( struct ListNode **L )
{
    struct ListNode *p,*q=NULL,*head=NULL,*tail=NULL;
    
    for (p=*L;p;p=p->next)
    {
        if (p->data%2==1)
        {
            if (head==NULL)
            {
                head=tail=p;
            }
            else {
                tail->next=p;
                tail=p;
            }
            if (q==NULL)
            {
                *L=p->next;
            }
            else {
                q->next=p->next;
            }
        }
        else {
            q=p;
        }
    }
    return head;
}

 

我的问题:当输入的头尾都是偶数时奇链表的输出是错的。。为什么??

  • 写回答

3条回答 默认 最新

  • 正在学C++ 2021-04-23 08:09
    关注
    struct ListNode *getodd( struct ListNode **L )
    {
        struct ListNode *p,*q=NULL,*head=NULL,*tail=NULL, *temp;
    
        for (p=*L,*L = NULL;p;p=temp)
        {
            temp = p->next;
            if (p->data%2==1)
            {
                if (head==NULL)
                {
                    head=tail=p;
                }
                else {
                    tail->next=p;
                    tail=p;
                    tail->next = NULL;
                }
            }
            else {
                if (q==NULL)
                {
                    q = *L = p;
                }
                else {
                    q->next=p;
                    q = q->next;
                    q->next = NULL;
                }
            }
        }
        return head;
    }

    这次没问题啦,这个结果是我在main里面自己加了个while可以测多组数据。NULL表示链表为空,也是我自己加的。

    总之,这次的 getodd 没有问题啦

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

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?