数据结构与算法编程题13

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

cpp 复制代码
#include <iostream>
using namespace std;

typedef int Elemtype;
#define ERROR 0;
#define OK    1;

typedef struct LNode
{
	Elemtype data;      //结点保存的数据
	struct LNode* next; //结构体指针
}LNode, * LinkList;

/*单链表初始化*/
bool Init_LinkList(LinkList& L)
{
	L = (LinkList)malloc(sizeof(LNode));  //新建头结点
	if (L == NULL)
	{
		return ERROR;
	}
	L->data = 0;
	L->next = NULL;
	return OK;
}

/*单链表头插法*/
bool LinkList_head_instert(LinkList& L)
{
	int x = 0;
	LNode* p = NULL;
	while (cin >> x)
	{
		p = (LinkList)malloc(sizeof(LNode));
		if (p != NULL)  //防止分配地址失败
		{
			p->data = x;
			p->next = L->next;
			L->next = p;
			if (cin.get() == '\n') break;  //检测换行符
		}
		else
		{
			exit(0);
			cout << "内存分配失败" << endl;
		}
	}
	return OK;
}

/*单链表尾插法*/
bool LinkList_tail_instert(LinkList& L)
{
	int x = 0;
	LNode* p = NULL;
	LNode* r = NULL;
	r = L;
	while (cin >> x)
	{
		p = (LinkList)malloc(sizeof(LNode));
		if (p != NULL)  //防止分配地址失败
		{
			p->data = x;
			p->next = NULL;
			r->next = p;
			r = p;
			if (cin.get() == '\n') break;  //检测换行符
		}
		else
		{
			exit(0);
			cout << "内存分配失败" << endl;
		}
	}
	return OK;
}

/*单链表遍历*/
bool LinkList_All_value(LinkList L)
{
	if (L->next == NULL)
	{
		cout << "链表为空" << endl;
		return ERROR;
	}
	LNode* s = NULL;
	s = L->next;
	while (s != NULL)
	{
		cout << s->data << "   ";
		s = s->next;
	}
	cout << endl;
	free(s);
	return OK;
}

/*单链表长度*/
int LinkList_length(LinkList L)
{
	int count = 0;
	LNode* s = NULL;
	s = L->next;
	while (s != NULL)
	{
		count++;
		s = s->next;
	}
	return count;
}

/*清空单链表*/
void Clear_LinkList(LinkList& L)
{
	LNode* p = L->next;
	LNode* q = NULL;
	while (p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}

/*销毁单链表*/
void Destory_LinkList(LinkList& L)
{
	LNode* p = NULL;
	LNode* q = NULL;
	p = L;
	while (p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
	L = NULL;
}

bool zero_panding(LinkList& A, LinkList& B, LinkList& C)
{
	LNode* pa = NULL;	
	LNode* pb = NULL;
	LNode* pc = NULL;
	pa = A->next;
	A->next = NULL;
	pb = B; 
	pc = C;
	if (pa == NULL)
	{
		cout << "单链表为空" << endl;
		return ERROR;
	}
	while (pa != NULL)
	{
		if (pa->data < 0)
		{
			pb->next = pa;  //尾插
			pa = pa->next;
			pb = pb->next;
		}
		else //pa->data > 0
		{
			pc->next = pa;  //尾插
			pa = pa->next;
			pc = pc->next;
		}
	}
	pb->next = NULL;
	pc->next = NULL;
	return OK;
}
/*设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于
零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)*/
//for example: A   -1 2  3 -2 4 5
int	main(void)
{
	LinkList A = NULL;
	Init_LinkList(A);
	LinkList_tail_instert(A);//test1: -1 2 3 -2 4 5  test2:  -1 2 3 -2 4 5 7 -10  test3: -1 2 3 -2
	LinkList_All_value(A);
	LinkList B = NULL;
	Init_LinkList(B); //新建B链表(带头节点)
	LinkList C = NULL;
	Init_LinkList(C); //新建C链表(带头节点)
	zero_panding(A, B, C);
	LinkList_All_value(B);
	LinkList_All_value(C);
	return 0;
}
相关推荐
新晓·故知21 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
gorgor在码农1 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql
武昌库里写JAVA2 小时前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
一休哥助手3 小时前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
苏宸啊3 小时前
顺序表及其代码实现
数据结构·算法
lin zaixi()3 小时前
贪心思想之——最大子段和问题
数据结构·算法
夜雨翦春韭4 小时前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
一直学习永不止步4 小时前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
Amor风信子4 小时前
华为OD机试真题---跳房子II
java·数据结构·算法
Ljubim.te5 小时前
软件设计师——数据结构
数据结构·笔记