利用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(¬e);
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;
}
如果代码有什么问题,也欢迎大家相互交流。