西农大 数据结构 习题 单链表

题目描述
在单链表存储结构上实现基本操作:初始化、创建、插入、删除、查找、遍历、逆置、合并运算。
输入描述:
线性表长度 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;
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值