您的位置:首页 > 编程语言 > C语言/C++

C++ 链表

2015-10-24 14:58 661 查看
链表也是一种线性表,它的数据逻辑组织结构也是一维的,但链表的物理结构与顺序表有很大不同,链表的物理存储结构是一堆地址任意的存储单元,也就是说,链表中的数据在内存中的物理位置可能相互邻接也不可能不邻接。链表分为单链表、双链表和循环表几类。我们从简单的单链表入手;

template<typename datatype>class linklist

{

public:
linklist()//无参数构造函数//
{
head=new listnode();
}
linklist(listnode*node)//有参数构造函数//
{
head=node;}

~linklist()//析构函数//
{
delete head;
}
bool insertnode(int i,datatype newdata);//插入结点//
bool removenode(listnode*q);//删除结点//
bool cleanlink();//清空链表//
datatype getnodedata(listnode*p);//获取结点数据//
listnode*findnode(datatype value);//查找指定结点并返回地址//

private:
listnode*head;

}

结点的定义

template<typename datatype>class listnode

{

public:
listnode()
{
next=NULL;}
listnode(datatype item,listnode<datatype>*nextnode=NULL)
{
data=item;
next=nextnode;
}
~listnode()
{
next=NULL;
}
datatype getdata()//获取数据域//
return data;
listnode*getnext()//获取指针域//
return next;

private:
friend typename linklist<datatype>;//将linklist设为友元类,方便对node的成员数据和方法的访问//
datatype*next;
datatype data;

};

链表基本操作:

插入结点

template<typename datatype>bool linklist<datatype>::insertnode(int i,datatype newdata)

{
listnode<datatype>*p=head;
int j;
for(j=1;j<=i-1;j++)
{
p=p->next;
if(p==NULL)
break;
}
if(p==NULL&&j<(i-1))
return false;
listnode<datatype>*node=new listnode<datatype>(newdata);
node->next=p->next;
p->next=node;
return true;

}

在单链表的表尾添加新结点

template<typename datatype>bool linklist<datatype>::insertnode(datatype newdata)

{
listnode<datatype>*p=head;//设置游标指针//
listnode<datatype>*node=new listnode<datatype>(newdata);//分配空间//
if(node==NULL)//如果分配内存失败,返回false//
return false;
while(p->next!=NULL)//找到尾结点//
p=p->next;
p->next=node;
return true;

}

删除结点:

template<typename datatype>bool linklist<datatype>::removenode(listnode<datatype>*q)

{
if(q==NULL)
return false;
listnode<datatype>*pmove=head;//设置游标指针//
while(pmove->next!=q)//找到需要删除结点的前驱结点//
pmove=pmove->next;
pmove->next=q->next;//重新连接链表//
delete q;
return true;

}

查找特定值得结点:

template<typename datatype>listnode<datatype>* linklist<datatype>::findnode(datatype value)

{
listnode<datatype>*pmove=head;//设置游标指针//
while(pmove!=NULL&&pmove->data!=value)
pmove=pmove->next;
if(pmove==NULL)
exit(1);
else
return pmove;

}

清空链表:

template<typename datatype>void  linklist<datatype>::cleanlink()

{
listnode<datatype>*current=head;
while(head->next!=NULL)
{
current=head->next;//将current指向head的后继结点//
head->next=current->next;//将current的后继地址赋值给head的next域//
delete current;//回收current结点所占的空间//
}

}

双向链表是链表的另一种形式,它的特点是每一个结点包含两个指针域和一个数据域,两个指针prior和next分别指向结点的前驱结点和后继元素。

循环链表是一种特殊的链表形式,它的尾结点的指针域指向头结点,构成了一个环形。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: