链表:由两个递增有序线性表A、B归并新的递减有序线性表C

由两个递增有序线性表A、B归并新的递减有序线性表C

数据结构题目

严蔚敏版数据结构教材题集2.24

假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。

此题的算法思想为:首先将B表连接到A表后面,即连接后的A表为新的C表,再进行递减有序的排序。

c++代码如下:

#include <iostream>
#include <stdlib.h>
using namespace std;

typedef struct LNode
{
	int data;										//数据域
	struct LNode *next;								//指针域 
} LNode, *LinkList;

typedef struct SListInfo
{
	LinkList head;									//表头结点指针
	LinkList tail;									//表尾结点指针
	LNode *pCurNode;								//当前结点指针位置 
	int length;										//单链表的长度(元素个数) 
} SListInfo;

void InitList( SListInfo &L )
{	//初始化单链表 
	cout<<"-进行初始化操作-"<<endl;
	L.head = (LNode *)malloc(sizeof(LNode));		//申请头结点存储空间
	if( L.head == NULL )
		cout<<"error1"<<endl;						//存储空间申请失败
	L.head->next = NULL;							//头结点后无其他结点
	L.tail = L.head;								//尾结点指针也指向头结点
	L.pCurNode = L.head;							//当前指针也指向头结点
	L.length = 0;									//单链表长度为零
}	//InitList

void ListTraverse( SListInfo L )
{	//从链表的第一个元素开始,依次访问并输出链表的数据元素
	cout<<"-输出单链表如下-"<<endl;
	if( L.head->next == NULL )
		cout<<"error6"<<endl;;
	L.pCurNode = L.head->next;
	while( L.pCurNode->next != NULL)
	{
		cout<<L.pCurNode->data<<endl;				//输出元素 
		L.pCurNode = L.pCurNode->next;
	}
	cout<<L.pCurNode->data<<endl;					//输出表尾元素 
}	//ListTraverse

void InsertElem( SListInfo &L, int i, int e )
{	//在第i个位置后插入新的数据元素e
	LNode *s = (LNode *)malloc(sizeof(int));		//申请新的结点
	if( s == NULL )
		cout<<"error8"<<endl;;						//申请失败
	s->data = e; 									//将e存入新结点 
	L.pCurNode = L.head;
	for( ; i > 0; i -- )							//找到位置i 
	{
		if( L.pCurNode->next == NULL)
		{
			cout<<"error9"<<endl;
			break;
		}
		L.pCurNode = L.pCurNode->next;
	}
	if( L.pCurNode->next != NULL)
	{
		s->next = L.pCurNode->next;					//插入元素e 
		L.pCurNode->next = s;
		L.length += 1;								//链表长度+1 
	}
	else
	{
		L.pCurNode->next = s;
		s->next = NULL;
		L.length += 1;
		L.tail = s;
	}
}	//InsertElem

int RankList( SListInfo &L )
{
	LNode *p;
	L.pCurNode = L.head->next;
	while( L.pCurNode->next != NULL )
	{
		p = L.pCurNode->next;
		while( p != NULL )											//冒泡排序(递减) 
		{
			if( L.pCurNode->data < p->data )
			{
				L.pCurNode->data = L.pCurNode->data + p->data;		//交换数值 
				p->data = L.pCurNode->data - p->data;
				L.pCurNode->data = L.pCurNode->data - p->data;
			}
			p = p->next;
		}
		L.pCurNode = L.pCurNode->next;
	}
}

SListInfo newList( SListInfo &La, SListInfo &Lb )
{	//合并A、B表为C表,并使其递减有序
	La.tail->next = Lb.head->next;					//连接两个链表
	La.tail = Lb.tail;								//现在的A表即为新的C表 
	La.length = La.length + Lb.length;
	RankList(La);									//递减排序 
	return La;
}	//newList

int main()
{
	int i, n, d;
	int &e = d;
	SListInfo La, Lb;
	InitList(La);
	InitList(Lb);
	cout<<"-请输入链表A的长度-"<<endl;
	cin>>n;
	cout<<"-请依次输入A表数据元素-"<<endl;
	for( i = 0; i < n; i ++ )
	{
		cin>>d;
		InsertElem(La,i,e);
	}
	cout<<"-请输入链表B的长度-"<<endl;
	cin>>n;
	cout<<"-请依次输入B表数据元素-"<<endl;
	for( i = 0; i < n; i ++ )
	{
		cin>>d;
		InsertElem(Lb,i,e);
	}
	La = newList(La,Lb);
	cout<<"-输出新表如下-"<<endl;
	ListTraverse(La);
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一: 内容:1、设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试设计一算法,将x插入到线性表的适当位置上,以保持线性表有序性。 2、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算。 3、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表逆置的运算。 要求:了解线性表的逻辑结构特征,熟练掌握线性表的顺序存储结构的描述方法,及在其上实现各种基本运算的方法。 二:内容:1、已知带头结点的动态单链表L中的结点是按整数递增排序的,试写一算法将为x的结点插入到表L中,使L仍然有序。 2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可能少的时间完成。 3、假设有两个元素递增有序线性表A和B,均以单链表作存储结构,试编写算法将A表和B表归并成一个按元素递减有序线性表C,并要求利用原表的空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上实现线性表的各种基本运算的方法。 三:内容:1、假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向某个结点的指针,试编写算法删除结点*s的直接前驱结点。 2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。(头结点可以另辟空间) 3、有一双链表,每个结点中除有prior、data和next域外,还有一访问频度域freq,在链表被启用前,其均初始化为零。每当在链表上进行一次LOCATE(L,x)运算,元素为x的结点中freq域的增1,并使此链表中结点保持按freq递减的顺序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LOCATE算法。 要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 四:内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如:xyzzyx、xyzyx都算是中心对称的字符串。 2、设计算法判断一个算术表达式的圆括号是否配对。(提示:对表达式进行扫描,遇‘(’进栈,遇‘)’退掉栈顶的‘(’,表达式被扫描完毕,栈为空) 3、假设以带头结点的循环链表表示队列,并只设一个指针指向队尾,编写相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决一些实际问题。 五:内容:1、若X和Y是用结点大小为1的单链表表示的串,设计算法找出X中第一个不在Y中出现的字符。 2、设计一算法,在顺序串上实现串的比较运算strcmp(S,T)。 3、若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次与T匹配的子串逆置。 要求:熟练掌握串的顺序和链接存储结构的实现方法;熟练掌握在两种存储结构上实现串的各种运算。 六:内容:1、以二叉链表作存储结构,设计求二叉树高度的算法。 2、一棵n个结点的完全二叉树用向量作存储结构,用非递归算法实现对该二叉树进行前序遍历。 3、以二叉链表作存储结构,编写非递归的前序、中序、后序遍历算法。 要求:熟悉二叉树的各种存储结构的特点及适用范围;掌握建立二叉树的存储结构的方法;熟练掌握二叉树的前序、中序、后序遍历的递归及非递归算法;灵活运用递归的遍历算法实现二叉树的其它各种运算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值