我是计算机专业的一位本科生,现在是大一,希望我的代码对你有所帮助,欢迎斧正
单链表的结点
以下图片均取自《数据结构c++》第二版
尾插法
即为将每次新申请的结点插到终端结点的后面
头插法
即为将每个新申请的结点都插入到头结点的后面
结点插入时的情况
运行结果:
代码实现:
#include<iostream>
using namespace std;
template<class T>//结点(类模板)
class Node
{
public:
T data;//数据域
Node<T> *next;//指针域
};
template<class T>
class LinkList
{
private:
Node<T> *head;//头结点
public:
LinkList();//构造函数
void CreateList();//创建单链表
~LinkList();//析构函数
int Length();//求单链表的长度
bool Get(int index);//得到序号为index的结点元素值
bool Locate(T data);//得到第一个元素值为data的结点的序号
bool Insert(int index,T data);//在序号index位置插入元素值为data的结点
bool Delete(int index);//删除序号为index的结点
bool PrintList();//输出单链表所有结点的元素值
void Exchangedata(int index1,int index2);//进行两结点元素值的交换
};
template<class T>
LinkList<T>::LinkList()//初始化为空链表
{
head=new Node<T>;
head->data=0;
head->next=NULL;
}
template<class T>
void LinkList<T>::CreateList()
{
int length;
T data;
cout<<"正在创建单链表(尾插),请输入你要创建的单链表的长度"<<endl;
cin>>length;
for(int i=0;i<length;i++)
{
cout<<"请输入第"<<i+1<<"个结点的元素值:";
cin>>data;
Insert(Length()+1,data);//采用尾插方式进行创建单链表
}
}
template<class T>
bool LinkList<T>::Insert(int index,T data)
{
Node<T> *p=head,*s;
if(index<=0)
{
cout<<"插入位置不合法,请输入为正数的插入位置"<<endl;
return false;
}
if(index>Length())//所插位置超出单链表长度时
{
while(p->next!=NULL)
{
p=p->next;
}
//此时指针p指向终端结点
s=new Node<T>;
p->next=s;//s成为p的后继结点
s->data=data;//给予数据
s->next=NULL;//s成为终端结点
//进行单链表的插入;
}
else//所插位置位于链表长度内时
{
for(int i=0;i<index-1;i++)
{
p=p->next;
}
//此时指针p指向第index-1个结点
s=new Node<T>;
s->next=p->next;//s成为第index的前驱结点
p->next=s;//s成为p的后继结点
s->data=data;//给予数据
//进行单链表的插入
cout<<"已成功插入结点n(*≧▽≦*)n"<<endl;
return true;
}
}
template<class T>
int LinkList<T>::Length()
{
Node<T> *p=head;
int num=0;
while(p->next!=NULL)
{
num++;
p=p->next;
}
return num;
}
template<class T>
LinkList<T>::~LinkList()//销毁线性表
{
Node<T> *p=head,*s;
while(p->next!=NULL)
{
s=p->next;
p=p->next;
delete s;
}
delete p;
delete head;
cout<<"单链表销毁成功╭(╯^╰)╮"<<endl;
}
template<class T>
bool LinkList<T>::Get(int index)
{
Node<T> *p=head;
if(index<=0||index>Length())//超出查找范围
{
cout<<"结点元素查找不合法"<<endl;
return false;
}
else
{
for(int i=0;i<index;i++)
{
p=p->next;
}
cout<<"查找成功,该结点的元素值为:"<<p->data<<endl;
return true;
}
}
template<class T>
bool LinkList<T>::Locate(T data)
{
Node<T> *p=head;
int num=0;
while(p->next!=NULL)
{
num++;
p=p->next;
if(p->data==data)
{
cout<<"成功找到该结点,该结点点到的位置为:"<<num<<endl;
return true;
}
}
cout<<"该单链表中没有该结点"<<endl;
return false;
}
template<class T>
bool LinkList<T>::Delete(int index)
{
Node<T> *p=head,*s;
if(index<=0||index>Length())
{
cout<<"删除位置不合法"<<endl;
return false;
}
else if(index==Length())
{
for(int i=0;i<Length()-1;i++)
{
p=p->next;
}
p->next=NULL;
}
else
{
for(int i=0;i<index-1;i++)
{
p=p->next;
}
s=new Node<T>;
s=p->next;
p->next=s->next;
cout<<"成功删除结点"<<index<<endl;
return true;
}
}
template<class T>
bool LinkList<T>::PrintList()
{
int i=1;
Node<T> *p=head;
if(p->next==NULL)
{
cout<<"该链表为空链表!"<<endl;
return false;
}
else
{
while(p->next!=NULL)
{
p=p->next;
cout<<"第"<<i<<"个结点的元素值为:"<<p->data<<endl;
i++;
}
cout<<"成功输出结点元素值!"<<endl;
return true;
}
}
template<class T>
void LinkList<T>::Exchangedata(int index1,int index2)
{
Node<T> *p=head,*s1,*s2;
int Min,Max,data;
//定位结点的前后
Min=(index1>index2)?index2:index1;
Max=(index1>index2)?index1:index2;
if(Min>0&&Max<=Length())
{
for(int i=0;i<Min-1;i++)
{
p=p->next;
}
s1=p->next;
p=head;
for(int i=0;i<Max-1;i++)
{
p=p->next;
}
s2=p->next;
data=s1->data;
s1->data=s2->data;
s2->data=data;
cout<<"结点元素值交换成功"<<endl;
}
else
cout<<"结点元素值交换失败"<<endl;
}
int main()
{
cout<<"-------------------------------------------------单链表操作系统---------------------------------------------------"<<endl;
LinkList<int> list;
list.CreateList();
cout<<"------------------单链表已创建成功------------------"<<endl;
list.PrintList();
cout<<"------------------Insert--------------------"<<endl;
list.Insert(3,2);
list.PrintList();
cout<<"------------------Delete--------------------"<<endl;
list.Delete(2);
list.PrintList();
cout<<"--------------------Get---------------------"<<endl;
list.Get(1);
cout<<"--------------------Exchange----------------"<<endl;
list.Exchangedata(1,2);
list.PrintList();
cout<<"-------------------------------------------------已退出单链表操作系统-----------------------------------------------"<<endl;
return 0;
}