要求:设计算法将一个带头结点的单链表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指向新的待处理结点。
}
}