爱学习520 发表于 2020-11-7 21:00:48

分离链表节点值奇数偶数,这个哪里错了


请问这个哪里错了?题目是设有一个以h1为头指针的带头结点的单链表,其结点数据域存放的都是正整数,试用C语言写一个函数把该单链表分解为两个单链表,一个单链表以h1为头指针,只存放奇数,另一个单链表以h2为头指针,只存放偶数。要求只增设一个头结点h2,不再另开辟存储空间。


void ChangeList(Plinklist p)
{
       
        //h1存放奇数、h2存放偶数
        Plinklist h1=p;
        Plinklist h2=(Plinklist)malloc(sizeof(linklist));
        Plinklist even=h2,odd=h1;
       
        p=p->next;

        //遍历链表
        while(p)
        {
       
                //识别偶数
                if(p->data%2==0)
                {
                        even->next=p;
                        even=p;
                       
                }
                //识别奇数
                if(p->data%2!=0)
                {
                        odd->next=p;
                  odd=p;
          
                }
                p=p->next;
               
        }
       
        //测试输出
        h1=h1->next;
        h2=h2->next;
       
        printf("奇数链表的输出\n");
        while(h1)
        {       
                printf("%d",h1->data);
                h1=h1->next;       
        }
        printf("\n偶数链表的输出\n");
        while(h2)
        {       
                printf("%d",h2->data);
                h2=h2->next;       
        }
}               

爱学习520 发表于 2020-11-7 21:02:15

本帖最后由 爱学习520 于 2020-11-7 21:11 编辑

这是我上面的完整代码,建立了一个带头节点的链表。谁帮我看看上面哪里错了,可以用下面这个代码调试一下看看

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
        int data;
        struct node *next;
}linklist,*Plinklist;

Plinklist create_list()
{
       
        Plinklist phead,ptail,p;
        int i,len;
       
        printf("请输入需要创建的链表个数:\n");
        scanf("%d",&len);


        //建立空结点,该结点不存放数据
        p=(Plinklist)malloc(sizeof(linklist));
        phead=ptail=p;
        p->next=NULL;
       
        for(i=0;i<len;i++)
        {
               
                p=(Plinklist)malloc(sizeof(linklist));
               
                //给申请的空间结点赋值       
                printf("请输入第%d需要每个节点数据:\n",i+1);
            scanf("%d",&p->data);
           
      //连结链表
            ptail->next=p;
            p->next=NULL;
           
            //记录当前指向,不然下次循环得覆盖了
            ptail=p;

        }
       
        return phead;

}

void ChangeList(Plinklist p)
{
       
        //h1存放奇数、h2存放偶数
        Plinklist h1=p;
        Plinklist h2=(Plinklist)malloc(sizeof(linklist));
        Plinklist even=h2,odd=h1;
       
        p=p->next;

        //遍历链表
        while(p)
        {
       
                //识别偶数
                if(p->data%2==0)
                {
                        even->next=p;
                        even=p;
                       
                }
                //识别奇数
                if(p->data%2!=0)
                {
                        odd->next=p;
                  odd=p;
          
                }
                p=p->next;
               
        }
       
        //测试输出
        h1=h1->next;
        h2=h2->next;
       
        printf("奇数链表的输出\n");
        while(h1)
        {       
                printf("%d",h1->data);
                h1=h1->next;       
        }
        printf("\n偶数链表的输出\n");
        while(h2)
        {       
                printf("%d",h2->data);
                h2=h2->next;       
        }
}               

//函数测试
int main()
{
       
        Plinklist p=create_list();
        ChangeList(p);
       
       
       
       
       
       
       
       
       
       
}

xieglt 发表于 2020-11-7 23:57:13

爱学习520 发表于 2020-11-7 21:02
这是我上面的完整代码,建立了一个带头节点的链表。谁帮我看看上面哪里错了,可以用下面这个代码调试一下看 ...

void ChangeList(Plinklist p)
{
      
    //h1存放奇数、h2存放偶数
        Plinklist h1=p;
        Plinklist h2=(Plinklist)malloc(sizeof(linklist));
        Plinklist even=h2,odd=h1;
        Plinklist pfast,pslow;

        h2->next = NULL;
        pslow = p->next;
        pfast = NULL;
       
        do
        {
                if(pslow == NULL)
                {
                        break;
                }
                else
                {
                        pfast = pslow->next;
                }
               
                //偶数
                if(pslow->data % 2 == 0)
                {
                        //偶数链表连接
                        even->next = pslow;
                        //偶数链表指针到尾
                        even = pslow;
                        //next置空
                        even->next = NULL;
                        //基数链表断掉当前节点,指向下一节点
                        odd->next = pfast;
                }
                else//基数
                {
                        //基数链表指针到尾
                        odd = pslow;
                }

                pslow = pfast;
        }while (1);
               
        //测试输出
        h1=h1->next;
        h2=h2->next;
       
        printf("奇数链表的输出\n");
        while(h1)
        {      
                printf("%d,",h1->data);
                h1=h1->next;      
        }
        printf("\n偶数链表的输出\n");
        while(h2)
        {      
                printf("%d,",h2->data);
                h2=h2->next;      
      }
}            
页: [1]
查看完整版本: 分离链表节点值奇数偶数,这个哪里错了