数据结构实验一,第25题:链表的分解

描述

利用单链表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 
using namespace std;
typedef struct link {
	int data;
	struct link* next;
}link,*linklist;

void Create(linklist& L, int n)
{
	linklist p,r;
	L = new link;
	L->next = NULL;
	r = L;
	while (n--)
	{
		p = new link;
		cin>>p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

void Split(linklist A, linklist& B, linklist& C)
{
	B = new link;
	C = new link;
	linklist p, pb, pc;
	p = A->next;
	pb = B;
	pc = C;
	while (p)
	{
		if (p->data < 0)
		{
			pb->next = p;
			pb = pb->next;
			p = p->next;
		}
		else
		{
			pc->next = p;
			pc = pc->next;
			p = p->next;
		}
	}
	pb->next = NULL;
	pc->next = NULL;
}

void Output(linklist L)
{
	linklist p;
	p = L->next;
	int flag = 1;
	while (p)
	{
		if (flag)
		{
			flag = 0;
			cout << p->data;
		}
		else
			cout <<" "<< p->data;
		p = p->next;
	}
	cout << endl;
}

int main()
{
	linklist A,B,C;
	int n;
	while (1)
	{
		cin >> n;
		if (n == 0)
			break;
		Create(A,n);
		Split(A, B, C);
		Output(B);
		Output(C);
		
	}
	return 0;
}

你可能感兴趣的:(数据结构,数据结构,链表的分解)