设计算法将一个带头结点的单链表LA分解为两个具有相同结构的链表LB、LC,其中LB
表的结点为LA表中值小于零的结点,而LC表的结点为LA表中值大于零的结点(链表LA中的元
素为非零整数,要求LB、LC表利用LA表的结点)
#include <iostream>
#define overflow -2
#define ok 1
#define error 0
using namespace std;
typedef int status;
typedef int ElemType;
//定义
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode , *LinkList;
//初始化
status InitList(LinkList &LA)
{
LA = new LNode; //生成一个新结点
LA->next = NULL; //结点指针域置空
return ok;
}
//创建一个长度为n的单链表
status CreatList_R(LinkList &LA, int n)
{
LNode *r = LA; //尾指针初始化指向头结点
for (int i = 0; i < n; i++)
{
LNode *p = new LNode; //生成新结点
cin >> p->data; //输入的数据存放在新结点的数据域
r->next = p;
p->next = NULL;
r = p;
}
return ok;
}
//输出
int DispList(LinkList L)
{
LNode *p = L->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
return ok;
}
//分解
/*----------------------------------------------*
分析:
从LA表的第一个结点开始,依次取其每个结点p,判断结点p的值是否小于0,利用前插法,将小于0的结点插入
LB表,大于等于0的结点插入LC表
补充:
头插法创建单链表L , p代表插入的结点
插入语句
p->next = L->next;
L->next = p;
*------------------------------------------------*/
status Discompose(LinkList &LA, LinkList &LB, LinkList &LC)
{
LNode *pa, *pb, *pc; //工作指针pa, pb, pc
pa = LA->next; //pa指向LA链表的首元结点
pb = LB ;
pb->next = NULL;
pc = LC;
pc->next = NULL;
while (pa)
{
LNode *r = pa->next; //生成一个新结点用来暂存pa的后继
if (pa->data < 0)
{
pa->next = pb->next; //将小于0的结点用前插法链接到pb
pb->next = pa;
}
else
{
pa->next = pc->next; //将大于0的结点用前插法插到pc表中
pc->next = pa;
}
pa = r; //pa指向新的待处理的结点
}
return ok;
}
//主函数
int main()
{
int n;
LinkList LA;
InitList(LA);
LinkList LB;
InitList(LB);
LinkList LC;
InitList(LC);
cout << "输入元素个数:" ;
cin >> n ;
cout << endl;
cout << "请输入线性表元素:" << ' ' ;
CreatList_R(LA, n);
cout << endl;
cout << "分解之后的链表LB为:" << endl;
Discompose(LA, LB, LC);
DispList(LB);
cout << endl;
cout << "分解之后的链表LC为:" << endl;
DispList(LC);
}
数据结构第二章课后习题第五题(分解链表)
于 2022-04-20 20:58:30 首次发布