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分别指向结点的前驱结点和后继元素。
循环链表是一种特殊的链表形式,它的尾结点的指针域指向头结点,构成了一个环形。
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分别指向结点的前驱结点和后继元素。
循环链表是一种特殊的链表形式,它的尾结点的指针域指向头结点,构成了一个环形。
相关文章推荐
- 个人对C语言字节对齐问题的一些见解
- 标准C++ string类型转换总结
- VC++6.0 VS2005 VS2008 VS2010 VS2012 VS2013 编译 连接时候到底调用了那些东东
- C/C++面试(3)——矩阵编程题(模拟法)
- switch语句的用法
- C++动态数组简单的模拟二元堆
- C++按位运算符
- c++web方案
- C语言:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(
- 【C语言】【笔试题】找出一组数据中成单出现的数字,其他所有数字都是成对出现的。(移位)
- 【C语言】不使用(a+b)/2这种方式,求两个数的平均值。
- 【C语言】【笔试题】编写函数: unsigned int reverse_bit(unsigned int value); 翻转二进制序列
- 【C语言】【笔试题】两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 对于sizeof的含义、应用及易混点的解析
- VC++ 将资源位图画到窗口上去的方法
- C++函数指针简介
- C++函数指针简介
- C语言:不使用(a+b)/2这种方式(会溢出),求两个数的平均值
- C语言:编写函数将一个整数的二进制位模式从左到右翻转后的值输出
- C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同(模除、移位)