线性表->链式线性表--简单

单链表ADT模板简单应用算法设计:有序单链表的归并+提纯

时间限制: 1s

类别: DS:线性表->链式线性表--简单

晚于 2024-05-08 23:59:00 后提交分数乘系数50%

截止日期:2024-05-11 23:59:00

问题描述

目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。

内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。)

(2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。

应用6:假设2个线性表分别由单链表A和B存储,其中数据元素按值非递减有序排列(即已经有序),现要求设计一个算法,将A和B归并为一个线性表 , 其数据元素仍按值非递减排列,且表中不存在值相同的元素。要求使用A和B的原存储空间,且B不再单独存在。

参考函数原型:

template<class ElemType>

void Merge_L_Pure_Order( LinkList<ElemType> &A, LinkList<ElemType> &B );

输入说明

第一行:有序单链表A的数据元素(数据元素之间以空格分隔)

第二行:有序单链表B的数据元素(数据元素之间以空格分隔)

输出说明

如第一行输入值为0、1、2、3之外的值,直接输出“err”

否则:

第一行:单链表A的遍历结果

第二行:单链表B的遍历结果

空行

第四行:归并+提纯后单链表A的遍历结果

#include<iostream>
#include<sstream>
#include<vector>
using namespace std;
template<class T>
struct node
{
	T data;
	node<T>* next;
	node()
	{
		next = NULL;
	}
};

template<class T>
class List
{
private:
	node<T>* head;
	node<T>* tail;
public:
	List()
	{
		head = new node<T>;
		tail = head;
	}
	void createList(vector <T> v)
	{
		node<T>* p;
		int n = v.size();
		for (int i = 0; i < n; i++)
		{
			p = new node<T>;
			p->data = v[i];
			tail->next = p;
			tail = p;
		}	
	}
	T getdate(node<T>* p)
	{
		return p->data;
	}
	void push_back(T x)
	{
		node<T>* p = new node<T>;
		p->data = x;
		tail->next = p;
		tail = p;
	}
	void push_front(T x)
	{
		node<T>* p = new node<T>;
		p->data = x;
		p->next = head->next;
		head->next = p;
	}
	node<T>*& gethead()
	{
		return head;
	}
	node<T>*& gettail()
	{
		return tail;
	}
	void pushback(node<T>*& p, node<T>*& q,node<T>*& qbefore)
	{
		qbefore->next = q->next;
		q->next = p->next;
		p->next = q;
		if (q->next == NULL)
		{
			tail=q;
		}
		p = q->next;
		q=qbefore->next;

	}
	void findbefore(node<T>* p,  node<T>*& pbefore)
	{
		node<T>* temp = head;
		while (temp->next != p)
		{
			temp = temp->next;
		}
		pbefore = temp;
	}
	void pushfront(node<T>*& p, node<T>*& q, node<T>*& qbefore)
	{
		node<T>* temp = head;
		while (temp->next != p)
		{
			temp = temp->next;
		}
		qbefore->next = q->next;
		q->next = p;
		temp->next = q;
		q=qbefore->next;
		
	}
	void next(node<T>*& p)
	{
		p = p->next;
	}
	void show()
	{
	  node<T>* p = head->next;
	  cout << p->data;
	  p = p->next;
	  while (p != NULL)
		{
			cout << "->"<<p->data;
			p = p->next;
		}
	  cout << endl;
	
	}
};

template<class T>
void Merge_L_Order(List<T>& A, List<T>& B)
{
	node<T>* la=A.gethead();
	node<T>* lb=B.gethead();
	node<T>* pa = la->next;
	node<T>* pb = lb->next;
	T a, b;
	while (pa != NULL && pb != NULL)
	{
		a = A.getdate(pa);
		b = B.getdate(pb);
		if (a < b)
		{
			A.next(pa);
		}
		else
		{
			A.pushfront(pa, pb,lb);
		}
	}
	if (pb != NULL)
	{
		A.gettail()->next = pb;
		A.gettail() = B.gettail();
	}
	delete lb;
}

template<class T>
void remove(List<T>&L)
{
	node<T> *p1=L.gethead();
	p1=p1->next;
	node<T> *p2;
	p2=p1->next;
	while(p2!=NULL)
	{
		if(p1->data==p2->data)
		{
			p1->next=p2->next;
			p2=p2->next;
		}
		else
		{
			p1=p1->next;
			p2=p2->next;
		}
	}
}

int main()
{
		int p;
		cin >> p;
		cin.ignore(1, '\n');
		string str1, str2;
		getline(cin, str1);
		getline(cin, str2);
		istringstream is1(str1);
		istringstream is2(str2);
		if (p == 0)
		{
			vector<int>v;
			int a;
			while (is1 >> a)
			{
				v.push_back(a);
			
			}
			List<int> la;
			la.createList(v);
			la.show();
			vector<int>w;
			int b;
			while (is2 >> b)
			{
				w.push_back(b);
				
			}
			List<int> lb;
			lb.createList(w);
			lb.show();
			cout << endl;
			Merge_L_Order(la, lb);
			remove(la);
			la.show();
		}
		else if (p == 1)
		{
			vector<double>v;
			double a;
			while (is1 >> a)
			{
				v.push_back(a);
				
			}
			List<double> la;
			la.createList(v);
			la.show();
			vector<double>w;
			double b;
			while (is2 >> b)
			{
				w.push_back(b);
				
			}
			List<double> lb;
			lb.createList(w);
			lb.show();
			cout << endl;
			Merge_L_Order(la, lb);
			remove(la);
			la.show();
		}
		else if (p == 2)
		{
			vector<char>v;
			char a;
			while (is1 >> a)
			{
				v.push_back(a);
				
			}
			List<char> la;
			la.createList(v);
			la.show();
			vector<char>w;
			char b;
			while (is2 >> b)
			{
				w.push_back(b);
				
			}
			List<char> lb;
			lb.createList(w);
			lb.show();
			cout << endl;
			Merge_L_Order(la, lb);
			remove(la);
			la.show();
		}
		else if (p == 3)
		{
			vector<string>v;
			string a;
			while (is1 >> a)
			{
				v.push_back(a);
				
			}
			List<string> la;
			la.createList(v);
			la.show();
			vector<string>w;
			string b;
			while (is2 >> b)
			{
				w.push_back(b);
				
			}
			List<string> lb;
			lb.createList(w);
			lb.show();
			cout << endl;
			Merge_L_Order(la, lb);
			remove(la);
			la.show();
		}
		else cout << "err" << endl;
	return 0;
}

单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

时间限制: 1s

类别: DS:线性表->链式线性表--简单

晚于 2024-05-08 23:59:00 后提交分数乘系数50%

截止日期:2024-05-11 23:59:00

问题描述

目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。

内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。)

(2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。

应用1:假设有一个带头结点的单链表A,现要求设计一个算法,实现单链表的就地逆置,即利用原表的存储空间实现表中前m 个元素和后n 个元素的互换。

参考函数原型:

<
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值