每日一题Day27

链表的分解

描述

利用单链表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<stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
} Node,*List;

void Create(List &L,int n)
{
	Node *p,*rear;
	L=(Node *)malloc(sizeof(Node));
	L->next=NULL;
	rear=L;
	while(n--)
	{
		p=(Node *)malloc(sizeof(Node));
		scanf("%d",&p->data);
		p->next=rear->next;
		rear->next=p;
		rear=p;
	}
}

void Divide(List &L,List &La,List &Lb)
{
	Node *p,*p1,*p2,*q;
	La=(Node *)malloc(sizeof(Node));
	La->next=NULL;
	Lb=(Node *)malloc(sizeof(Node));
	Lb->next=NULL;
	p1=La;
	p2=Lb;
	p=L->next;
	while(p)
	{
		if(p->data < 0)
		{
			p1->next=p;
			p1=p;
			p=p->next;
		}
		else if(p->data > 0)
		{
			p2->next=p;
			p2=p;
			p=p->next;
		}
		else
		{
			q=p;
			p=p->next;
			free(q);
		}
	}
	p1->next=NULL;
	p2->next=NULL;
	free(L);
}

int main()
{
	int n;
	List L,La,Lb;
	Node *p;
	while(1)
	{
		scanf("%d",&n);
		if(n==0)
			break;
		Create(L,n);
		Divide(L,La,Lb);
		p=La->next;
		int first=1;
		while(p)
		{
			if(first)
			{
				printf("%d",p->data);
				first=0;
			}
			else
			{
				printf(" %d",p->data);
			}
			p=p->next;
		}
		printf("\n");
		p=Lb->next;
		first=1;
		while(p)
		{
			if(first)
			{
				printf("%d",p->data);
				first=0;
			}
			else
			{
				printf(" %d",p->data);
			}
			p=p->next;
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81605758