单链表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 个元素的互换。
参考函数原型:
<