数据结构第二章课后习题第五题(分解链表)



设计算法将一个带头结点的单链表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);
} 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值