前端时间搜了下创建单链表,发现全是些片段,创完我都不知道如何声明!!
气煞我也,下面是我自己的代码,包括对单链表的增删查改操作,以及应用实例。
#include <iostream>
using namespace std;
template <class DataType>
struct Node
{
DataType data;
Node<DataType> *next; //结点类
};
template <class DataType>
class LinkList
{
public:
LinkList( ); //新建空表
LinkList(DataType a[ ], int n); //链表赋值
~LinkList( ); //析构函数
int Length( ); //计算长度
DataType Get(int i); //按位查找
int Locate(DataType x); //按值查找
void Insert(int i, DataType x); //插入操作
DataType Delete(int i); //删除操作
void PrintList( ); //遍历操作
private:
Node<DataType> *first;
};
template <class DataType>
void LinkList<DataType> :: PrintList( )
{
Node<DataType> *p = first->next;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
cout<<endl;
}
template <class DataType>
int LinkList<DataType> :: Length( )
{
Node<DataType> *p = first->next;int count = 0;
while (p != NULL)
{
p = p->next;
count++;
}
return count; //注意count的初始化和返回值之间的关系
}
template <class DataType>
int LinkList<DataType> :: Locate(DataType x)
{
Node<DataType> *p = first->next;
int count = 1;
while (p != NULL)
{
if (p->data == x) return count; //查找成功,返回序号
p = p->next;
count++;
}
return 0; //退出循环表明查找失败
}
template <class DataType>
void LinkList<DataType> :: Insert(int i, DataType x)
{
Node<DataType> *p = first ,*s;
int count = 0; //工作指针p应指向头结点
while (p != NULL && count < i - 1) //查找第i – 1个结点
{
p = p->next;
count++;
}
if (p == NULL) throw "位置"; //没有找到第i – 1个结点
else {
s = new Node<DataType>; s->data = x; //申请一个结点s
s->next = p->next; p->next = s; //结点s插入结点p之后
}
}
template <class DataType>
DataType LinkList<DataType> :: Get(int i)
{
Node<DataType> *p=first->next;int count=1;
while (p!=NULL && count<i)
{
p=p->next;
count++;
}
if(p == NULL)throw "位置";
else return p->data;
}
template <class DataType>
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
Node<DataType> *r,*s;
first = new Node<DataType>; //生成头结点
r = first; //尾指针初始化
for (int i = 0; i < n; i++)
{
s = new Node<DataType>; s->data = a[i];
r->next = s; r = s;
}
r->next = NULL;
}
template <class DataType>
LinkList<DataType> :: LinkList()
{
first=new Node<DataType>; //生成头结点
first->next=NULL; //头节点的指针域置空
}
template <class DataType>
DataType LinkList<DataType> :: Delete(int i)
{
Node<DataType> *p,*q;
DataType x;
p = first ;int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL) throw "位置";
else {
q = p->next; x = q->data;
p->next = q->next;
delete q; return x;
}
}
template <class DataType>
LinkList<DataType> :: ~LinkList( )
{ Node<DataType> *q;
while (first != NULL)
{
q = first;
first = first->next;
delete q;
}
}
int main(){
int a[5]={11,22,33,44,55};
LinkList <int> L(a,5);
cout<<"插入前数据:";L.PrintList();
cout<<"第二位数据的值:";cout<<L.Get(2);cout<<endl;
cout<<"11对应的序号:";cout<<L.Locate(11);cout<<endl;
try
{
L.Insert(1,66);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"插入后的数据:";L.PrintList();
try
{
L.Delete(5);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"删除后的数据:";L.PrintList();
cout<<"数组长度:";cout<<L.Length();
return 0;
}