【练习】循环链表中的正负数分为两个循环链表

  题目:已知一个带哨兵结点h的循环单链表中的数据元素含有正数和负数,构造两个循环单链表,使一个循环单链表中只含有整数,另一个循环单链表中只含负数。
  分析:先创建两个空的单链表ha和hb,然后依次查看指针p指向的结点元素值,如果值为正数,则将其插入ha中,否则将其插入hb中。最后使一个即诶但那的指针域指向头结点构成循环链表。

  • 类型定义
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*单链表类型定义*/
typedef int DataType;
typedef struct Node
{
    DataType data;
    struct Node *next;
}ListNode,*LinkList;
/*函数声明*/
  • 函数文件
LinkList CreateCycList()
/*创建循环单链表*/
{
    ListNode *h=NULL,*s=NULL,*t=NULL;
    DataType e;
    int i=1;
    printf("创建一个循环单链表(输入0表示创建链表结束):\n");
    while(1)
    {
        printf("请输入第%d个结点的data域值:",i);
        scanf("%d",&e);
        if(e==0)
            break;
        if(i==1)
        {
            h=(ListNode*)malloc(sizeof(ListNode));
            h->data=e;
            h->next=NULL;
            t=h;
        }
        else
        {
            s=(ListNode*)malloc(sizeof(ListNode));
            s->data=e;
            s->next=NULL;
            t->next=s;
            t=s;
        }
        i++;
    }
    if(t!=NULL)
        t->next=h;
    return h;
}

void Split(LinkList ha,LinkList hb)
/*将一个循环单链表ha构造成两个循环单链表,其中ha中的元素只含正数,hb中的元素只含负数*/
{
    ListNode *ra,*rb,*p=ha->next;
    int v;
    ra=ha;
    ra->next=NULL;
    rb=hb;
    rb->next=NULL;
    while(p!=ha)
    {
        v=p->data;
        if(v>0)/*若元素值大于0,插入到ha中*/
        {
            ra->next=p;
            ra=p;
        }
        else/*若元素值小于0,插入到hb中*/
        {
            rb->next=p;
            rb=p;
        }
        p=p->next;
    }
    ra->next=ha;/*变为循环单链表*/
    rb->next=hb;/*变为循环单链表*/
}

void DispCycList(LinkList h)
/*输出循环单链表*/
{
    ListNode *p=h->next;
    if(p==NULL)
    {
        printf("链表为空!\n");
        return;
    }
    while(p->next!=h)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    printf("%4d",p->data);
    printf("\n");
}
  • 主程序
void main()
{
    LinkList ha,hb=NULL;
    ListNode *s,*p;
    ha=CreateCycList();
    p=ha;
    while(p->next!=ha)/*找ha的最后一个结点,p指向该结点*/
        p=p->next;
    /*为ha添加哨兵结点*/
    s=(ListNode*)malloc(sizeof(ListNode));
    s->next=ha;
    ha=s;
    p->next=ha;
    /*创建一个空的循环单链表hb*/
    s=(ListNode*)malloc(sizeof(ListNode));
    s->next=hb;
    hb=s;

    Split(ha,hb);
    printf("输出循环单链表A(正数):\n");
    DispCycList(ha);
    printf("输出循环单链表B(负数):\n");
    DispCycList(hb);
}
  • 测试结果


这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值