鱼C论坛

 找回密码
 立即注册
查看: 1606|回复: 2

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

[复制链接]
发表于 2020-11-7 21:00:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

请问这个哪里错了?题目是设有一个以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;        
        }
}                
]6C`6~(YUj$~I%AII{D1X.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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);
        
        
        
        
        
        
        
        
        
        
 } 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;       
        }
}            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 17:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表