链表的分解

描述

 

利用单链表A表示一个非零整数序列,把A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。要求空间复杂度为O(1),链表B和C均利用链表A的结点空间。

 

输入

多组数据,每组数据有两行,第一行为链表A的长度n,第二行为链表A的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

对于每组数据分别输出两行,分别对应链表B和C的元素,每个数据之间用空格分隔。

 

输入样例 1                             

7
3 -6 1 -2 4 -3 8
8
2 5 3 -1 -2 2 6 -1
0


输出样例 1

-6 -2 -3
3 1 4 8
-1 -2 -1
2 5 3 2 6
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#include<math.h>
#define MAXSIZE 1000
#define OVERFLOW -2
#define OK 1
#define ERROR 0

typedef struct LNode{
    int num;
    struct LNode *next; 
}LNode,* LinkList;

void Inist_List(LinkList& L){
    L=new LNode;
    L->next=NULL;
}

void Zuhe(LinkList& L1){
    LinkList H1=L1;
    int m,n;
    while(1){
        scanf("%d",&m);
        if(m==0)
            break;
        for(int i=0;i<m;i++){
            LinkList p= new LNode;
            scanf("%d",&p->num);
            p->next=NULL;
            L1->next=p;
            L1=p;
        }
        L1=H1;
        LinkList p1,p2,M1,M2,q;
        Inist_List(M1);
        Inist_List(M2);
        p1=M1;
        p2=M2;
        for(q=L1->next;q!=NULL;){
            if(q->num<0){
                p1->next=q;
                q=q->next;
                p1=p1->next;
                p1->next=NULL;
            }
            else{
                p2->next=q;
                q=q->next;
                p2=p2->next;
                p2->next=NULL;
            }
        }
        LinkList b;
        b=M1;
        while(b->next->next)
        {
            b=b->next;
            printf("%d ",b->num);
        }
        printf("%d\n",b->next->num);
        LinkList c;
        c=M2;
        while(c->next->next)
        {
            c=c->next;
            printf("%d ",c->num);
        }
        printf("%d\n",c->next->num); 
}
}

int main(){
    LinkList L1;
    Inist_List(L1);
    Zuhe(L1);
    return 0;
}

 

                     

posted @ 2020-10-11 17:11  奕玑  阅读(285)  评论(0)    收藏  举报