链表筛选思路

在一条无0链表中筛选出一条大于0和一条小于0的链表

算法设计思路:
把ListA进行筛选,把<0放在ListB里,同时在ListA跳过(不用free),最后让ListC与ListA相等。

//链表设计:没有多余的空节点
void separation(List *ListA,List *ListB,List *ListC){
    Node *p;
    Node *q;
    Node *last;
    p=ListA->head;
    q=NULL;
    if(p->next==NULL){//当ListA只存在头节点的情况
        if(p->value<0){
            ListB->head=p;//使ListB的头节点为p
            ListA->head=q;//使ListA的头节点为q
        }
    }
    else{   
        for (p,q;p;q=p,p=p->next){
            if(p->value<0){
                if (ListB->head==NULL){
                    ListB->head=p;//如果ListB是空值。头节点指向p
                    }
                else {
                    last=ListB->head;
                    while(last->next){last=last->next;}//使last为ListB的尾节点
                    last->next=p;//让尾节点指向p   
                    }
                q->next=p->next;//把p在ListA中跳过
                p->next=NULL;//让ListB的尾节点指向NULL
                p=q;//让p等于q继续参与对ListA的遍历
            }
        }
    } 
    *ListC=*ListA;//让ListC等于ListA
}

结果展示

#include <string.h>
#include "Node.h"
#include "List.h"
#include <iostream>
int main(){
    List listA,listB,listC;
    int numberA,numberB;
    for(int i=5;i>0;i--)
        add(&listA,i);
    for(int i=-5;i<0;i++)
        add(&listA,i);
    printf("ListA的元素为\n");
    print(&listA);
    separation(&listA,&listB,&listC);
    printf("ListB的元素为\n");
    print(&listB);
    printf("ListC的元素为\n");
    print(&listC);
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值