要求:设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。

题目分析: B表的头结点使用原来A表的头结点,为C表新申请一个头结点。从A表的第一个结点开始,依次取其每个结点p,判断结点p的值是否小于0,利用前插法,将小于0的结点插入B表,大于等于0的结点插入C表。


算法描述:

void Decompose(LinkedList A)
{//链表分解:
	B = A;
	B->next = NULL;    ∥B表初始化
	C = new LNode; ∥为C申请结点空间
	C->next = NULL;     ∥C初始化为空表
	p = A->next;        ∥p指向A的首元结点,作为工作指针
	while (p)
	{
		r = p->next;      ∥暂存p的后继,下面用到前插法
		if (p->data < 0)
		{∥将小于0的结点链入B表
			p->next = B->next;		//①
			B->next = p;			//②
		}
		else
		{∥将大于等于0的结点链入C表
			p->next = C->next;
			C->next = p;
		}
		p = r;	∥p指向新的待处理结点。
	}
}