C++实现数据结构:链表

1. LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H

#include<iostream>
using namespace std;

template<class T>
struct Node
{
	T data;
	Node<T> *next;
};

template <class T>
class LinkList
{
public:
	LinkList();
	LinkList(T a[], int n);
	~LinkList();
	int Length();
	T Get(int pos);
	int Locate(T x);
	void Insert(int i, T item);
	T Delete(int i);
	void PrintList();
private:
	Node<T>*head;
};
#endif

2. LinkList.cpp

#define _CRT_SECURE_NO_WARNINGS   1

#include"LinkList.h"

template<class T>
LinkList<T>::LinkList()
{
	head = new Node<T>;
	head->next = NULL;
}
template<class T>
LinkList<T>::LinkList(T a[], int n)
{
	Node<T>* rear, *s;
	head = new Node<T>;
	rear = head;
	for (int i = 0; i < n; i++)
	{
		s = new Node<T>;
		s->data = a[i];
		rear->next = s;
		rear = s;
	}
	rear->next = NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
	Node<T>*p = head;
	while (p)
	{
		Node<T>*q = p;
		p = p->next;
		delete q;
	}
	head = NULL;

}
template<class T>
int LinkList<T>::Length()
{
	int num = 0;
	Node<T>*p = head->next;
	while (p)
	{
		p = p->next;
		num++;
	}
	return num;
}
template<class T>
T LinkList<T>::Get(int pos)
{
	Node<T>*p = head->next;
	int j = 1;
	while (j < pos&&p)
	{
		p = p->next;
		j++;
	}
	if (!p&&j>pos)
	{
		cerr << "查找位置非法\n";
		exit(-1);
	}
	else
	{
		return p->data;
	}
}
template<class T>
int LinkList<T>::Locate(T x)
{
	Node<T>*p = head->next;
	int j = 1;
	while (p&&p->data != x)
	{
		p = p->next;
		j++;
	}
	if (p)
		return j;
	else
		return 0;
}
template<class T>
void LinkList<T>::Insert(int i, T item)
{
	Node<T>*p = head;
	int j = 0;
	while (p&&j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p)
	{
		cerr << "输入非法\n";
		exit(-1);
	}
	else
	{
		Node<T>*s = new Node<T>;
		s->data = item;
		s->next = p->next;
		p -> next = s;
	}
}
template<class T>
T LinkList<T>::Delete(int i)
{
	Node<T>*p = head;
	int j = 0;
	int x = 0;
	while (j < i - 1 && p)
	{
		p = p->next;
		j++;
	}
	if (!p&&!p->next)
	{
		cerr << "输入非法\n";
		exit(-1);
	}
	else
	{
		Node<T>*q = p->next;
		x = q->data;
		p->next = q->next;
		delete q;
		return x;
	}
}
template<class T>
void LinkList<T>::PrintList()
{
	Node<T>*p = head->next;
	while (p)
	{
		cout << p->data << "  ";
		p = p->next;
	}
	cout << endl;
}

3. test.cpp

#define _CRT_SECURE_NO_WARNINGS   1

#include"LinkList.cpp"

#include<iostream>
using namespace std;

void menu()
{
	cout << "|------------------------------------|" << endl;
	cout << "|----------- 欢迎来到顺序表 ---------|" << endl;
	cout << "|---------------1.插入---------------|" << endl;
	cout << "|---------------2.删除---------------|" << endl;
	cout << "|---------------3.求长---------------|" << endl;
	cout << "|---------------4.取值---------------|" << endl;
	cout << "|---------------5.定位---------------|" << endl;
	cout << "|---------------6.打印---------------|" << endl;
	cout << "|---------------0.退出---------------|" << endl;
	cout << "|------------------------------------|" << endl;
}
int main()
{
	int *a;
	int n;
	cin >> n;
	a=new int[n];
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	cout << "现在开始我们的程序之旅" << endl;
	LinkList<int>L(a, n);
	int input = 0;
	do
	{
		menu();
		cout << "输入您要进行的操作的编号" << endl;
		cin >> input;
		switch (input)
		{
		case 1:
			cout << "请输入您要插入的位置和数值" << endl;
			int pos;
			int value;
			cin >> pos;
			cin >> value;
			L.Insert(pos, value);
			break;
		case 2:
			cout << "请输入您要删除的位置" << endl;
			int pos1;
			cin >> pos1;
			cout << "您删除的元素的值为:";
			cout << L.Delete(pos1) << endl;
			break;
		case 3:
			cout << "您的顺序表当前的长度为:" << L.Length() << endl;
			break;
		case 4:
			cout << "请输入您要查找的位置" << endl;
			int pos2;
			cin >> pos2;
			cout << "您查找的元素的值为:";
			cout << L.Get(pos2) << endl;;
			break;
		case 5:
			cout << "请输入您要查找的元素" << endl;
			int item;
			cin >> item;
			cout << "您查找的元素的位置为:";
			cout << L.Locate(item) << endl;;
			break;
		case 6:
			cout << "当前顺序表如下:" << endl;
			L.PrintList();
			break;
		case 0:
			cout << "程序退出,感谢使用" << endl;
			exit(-1);
			break;
		default:
			cout << "您的输入有误,请重新选择" << endl;
		}
	} while (input);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxkeepcoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值