利用C++实现单链表的基本操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43165699/article/details/97145256

利用C++实现单链表的基本操作

利用C++的模板类,实现了一些对于单链表的一些基本操作,包括插入、删除、查找等基本操作。实现的内容可能相对单薄,但我觉得能够帮助大家对单链表有一个比较好的理解。代码如下:

#include<iostream>
using namespace std;

template<typename datatype>class listnode;

/*************************链表结构声明*********************************/
template<typename datatype> class linklist
{
public:

	//无参数的构造函数
	linklist()
	{
		head = new listnode<datatype>();
		length = 0;
	}
	//有参数的构造函数
	linklist(listnode<datatype> *node)
	{
		head =node;
	}
	~linklist()
	{
		delete []head;
	}
public:
	bool insertNode(int i,datatype data);   //在i位置插入值
	bool deleteNode(int i);                 //删除i位置的值
	datatype findValue(int i);              //发现i位置的值
	int length;                             //链表的长度
private:
	listnode<datatype> *head;
	                             //表示链表长度
};
/*************************链表数据结构声明*********************************/
template<typename datatype>class listnode
{
public:
	//头结点指针初始为空
	listnode()
	{
		next = NULL;
	}
	//头结点指针初始为空
	listnode(datatype item, listnode<datatype> *nextnode=NULL)     
	{
		data = item;
		next = nextnode;
	}
	~listnode()
	{
	}
	//获取节点内的数据
	datatype getDate()
	{
		return data;
	}
	//获取指针域
	datatype *getNext()
	{
		return next;
	}
private:
	friend typename linklist<typename>;
	datatype data;
	listnode<datatype> *next;
};
/*************************主函数*********************************/
int main()
{
	listnode<int> note;
	linklist<int> list(&note);

	int n;
	cout << "输入链表长度" << endl;
	cin >> n;
	for (int i = 1; i <=n; i++)
	{
		list.insertNode(i,i);
	}
	for (int i = 1; i <=list.length; i++)
	{
		cout << "第" << i << "值=" << list.findValue(i) << ";";
	}

	cout << "" << endl;
	int InsertNumber, Insertdata;
	cout << "输入插入点" << endl;
	cin >> InsertNumber;
	cout << "输入插入值" << endl;
	cin >> Insertdata;
	list.insertNode(InsertNumber, Insertdata);
	for (int i = 1; i <= list.length; i++)
	{
		cout << "第" << i << "值=" << list.findValue(i) << ";";
	}
	int deleteNumber;
	cout << "" << endl;
	cout << "输入删除点" << endl;
	cin >> deleteNumber;
	list.deleteNode(deleteNumber);
	for (int i = 1; i <= list.length; i++)
	{
		cout << "第" << i << "值=" << list.findValue(i) << ";";
	}
	return 0;
}
/*************************链表的数据插入*********************************/
template<typename datatype>
bool linklist<datatype>::insertNode(int i, datatype data)
{
	listnode<datatype> * p = head;  //设置游标指针,初始化为头节点地址
	int j=1;
	for (j = 1; j <=i-1; j++)
	{

		p = p->next;              //利用游标指针依次往下查找
		if (p==NULL)
		{
			break;
		}
	}
	if ((p == NULL) && (j>(i-1)))//指针为空,且未到第i个位置,说明不存在第i个结点
	{
		cout << "插入位置无效" << endl;
		return false;
	}

	listnode<datatype> * node = new listnode<typename>(data);
	node->next = p->next;                      //将node的指针指向p的后继结点地址
	p->next = node;                            //p的后继指针指向node
	length = length + 1;

}
/*************************链表的指定位置上数据删除*********************************/
template<typename datatype>
bool linklist<datatype>::deleteNode(int i)
{
	listnode<datatype> * p = head;  //设置游标指针,初始化为头节点地址
	int j = 1;
	for (j = 1; j < i; j++)
	{
		p = p->next;              //利用游标指针依次往下查找
		if (p == NULL)
		{
			break;
		}
	}
	if ((p == NULL) && (j < (i - 1)))//指针为空,且未到第i个位置,说明不存在第i个结点
	{
		cout << "插入位置无效" << endl;
		return 0;
	}
	listnode<datatype> * q = p->next;
	p->next = q->next;
	delete q;
	length = length - 1;

}
/*************************查找链表内的固定位置的值*********************************/
template<typename datatype>
datatype linklist<datatype>::findValue(int i)
{
	listnode<datatype> * p = head;  //设置游标指针,初始化为头节点地址
	int j =1;
	for (j =1; j <= i ; j++)
	{
		p = p->next;              //利用游标指针依次往下查找
		if (p == NULL)
		{
			break;
		}
	}
	if ((p == NULL) && (j < (i - 1)))//指针为空,且未到第i个位置,说明不存在第i个结点
	{
		cout << "插入位置无效" << endl;
		return 0;
	}
	return p->data;
}

如果代码有什么问题,也欢迎大家相互交流。

猜你喜欢

转载自blog.csdn.net/weixin_43165699/article/details/97145256