题目描述
在单链表存储结构上实现基本操作:初始化、创建、插入、删除、查找、遍历、逆置、合并运算。
输入描述:
线性表长度 n
al a2a3... an (数值有序,为降序)要插入到线性表中的数字 x 和插入的位置 i 要删除的数字的位置 i
要查找的数字×线性表长度 m
b1b2... bm (数值有序,为升序)
输出描述:
插入一个数字后的线性表a1a2... an +1删除一个数字后的线性表a1a2.. an
查找一个输入的数字后如果找到,输出该数字的位置 i ,如果没有找到,输出" Not found "的信息。
逆置 al a2... an 后的线性表 an an —1...a1合并两个线性表后的线性表
#include <iostream>
using namespace std;
template <class T>
struct LinkNode {
T data;
LinkNode<T>* link;
LinkNode() {
link = NULL;
}
LinkNode(const T& item) {
data = item;
link = NULL;
}
};
template <class T>
class LineList {
public:
int length;
LinkNode<T>* first;
public:
LineList() {}
LineList(int n) {
length = n;
first = new LinkNode<T>();
LinkNode<T>* current = first;
for (int i = 0; i < length; i++) {
int num = 0;
cin >> num;
LinkNode<T>* newnode = new LinkNode<T>(num);
current->link = newnode;
current = newnode;
}
}
bool Insert(int x, int j) {
LinkNode<T>* newnode = new LinkNode<T>(x);
LinkNode<T>* current = first;
for (int i = 1; i <= length; i++) {
current = current->link;
if (i == j - 1) break;
}
newnode->link = current->link;
current->link = newnode;
length++;
return true;
}
bool Remove(int j) {
LinkNode<T>* current = first;
if (j == 1) {
current = current->link;
first->link = current->link;
delete current;
length--;
return true;
}
else {
for (int i = 1; i <= length; i++) {
current = current->link;
if (i == j - 1) break;
}
LinkNode<T>* current1 = current->link;
current->link = current->link->link;
delete current1;
length--;
return true;
}
return true;
}
bool Search(int x) {
LinkNode<T>* current = first;
for (int i = 1; i <= length; i++) {
current = current->link;
if (current->data == x) {
cout << i << endl;
return true;
}
}
cout << "Not found" << endl;
return false;
}
void NiZhi() {
LinkNode<T>* current = first;
LinkNode<T>* second = new LinkNode<T>();
LinkNode<T>* current2 = second;
int k = length;
for (int j = 1; j <= length; j++) {
for (int i = 1; i <= k; i++) {
current = current->link;
if (i == k) break;
}
current2->link = current;
current2 = current;
current = first;
k--;
}
first = second;
}
void Sort() {
LinkNode<T>* current = first;
LinkNode<T>* p;
LinkNode<T>* q;
for (p = current->link; p != NULL; p = p->link)
{
for (q = p->link; q != NULL; q = q->link) {
if (p->data > q->data)
{
int tmp = q->data;
q->data = p->data;
p->data = tmp;
}
}
}
}
void Print() {
LinkNode<T>* current = first;
for (int i = 1; i <= length; i++) {
current = current->link;
cout << current->data << " ";
}
cout << endl;
}
void HeBing(LineList<T>& L) {
LinkNode<T>* current = first;
for (int i = 1; i <= length; i++) {
current = current->link;
if (i == length) {
break;
}
}
current->link = L.first->link;
length += L.length;
}
};
int main() {
int n1, n2;
cin >> n1;
LineList<int> L1(n1);
cin >> n1 >> n2;
L1.Insert(n1, n2);
L1.Print();
cin >> n1;
L1.Remove(n1);
L1.Print();
cin >> n1;
L1.Search(n1);
L1.NiZhi();
L1.Print();
cin >> n1;
LineList<int> L2(n1);
L1.HeBing(L2);
L1.Sort();
L1.Print();
return 0;
}