链表的基本操作
链表可谓是数据结构中最重要的一个部分。从我个人的学习经验来看,只要对链表的操作了解了,学习后面的数据结构就会感觉到非常得有趣和轻松。最近老有同学说链表好复杂,其实链表就是数据结构里面最基础也是最简单的结构了。下面我就对链表说下我的想法吧,大神路过莫笑!!!个人意见欢迎拍砖(^_^)。。
线性表的链式表示方式就叫做链表。相比大家都知道数据结构可简单描述为4+2,即4种结构和2种表示方式。4种结构包括线性、树、图、集合,两种表达方式那就顺序和链式了。对于线性表、树、图的链式表达方式有着共性。树说白了就是一个具有多个next指针的线性表。那图呢?图就在在树的基础上,每个节点形成了一个弱环图(离散的知识,有些忘记了,就是能看见一个环的图,不管是否有向)。好了,废话就说到这里,下面我们正式开始来了解线性表了,这里我们只讨论链表(非循环单链表)。
对于线性表,我们需要多少操作呢?最主要的就4种吧:插入Insert,删除delete,查找find,清空clear,输出print。下面我们就依次来讨论这5种操作。
规则1:要用它,千万不要丢弃它,这里的丢弃不仅仅是释放空间,还包括要能够通过其他指针找到他。
规则2:要找到某个结点,必须从头开始遍历。有的同学说双向链表不是还可以从尾开始便利吗?这里我们主要是指出链表没有[i]这种下表操作符,不能随机访问。我们开始用着2个规则来玩弄链表于手心。
遍历链表:
为什么要先讲链表的便利呢?首先是要同学们有对指针这个大杀器的感觉。便利有规则2,我们只能从头开始找。下面直接给出代码:
template <classT>
void SingleList<T>::OutPut()
{
intj=1;
Node<T>*p=first;
while(p=p->link)
{
cout<<setw(8)<<p->element;
if(j==SingleList<T>::Lenth())
{
p=p->link;
}
if(j==SingleList<T>::Lenth())
break;
j++;
}
cout<<endl;
}
这段代码相信都能看懂吧,p->element表示节点中的元素,Length(),为返回链表长度的函数。我们也可以用p==NULL这个条件来终止循环。
插入元素:
template <classT>
bool SingleList<T>::Insert(int i,T &x)
{
if(i<0||i>n+1)
{
cout<<"out of the position"<<endl;
returnfalse;
}
intj=0;
Node<T> *p=first;
Node<T> *q=new Node<T>;
q->element=x;
while(j<i)//在第i歌位置后插入
{
p=p->link;
j++;
}//先找到插入的位置
q->link=p->link;
p->link=q;//规则2
n++;
returntrue;
}
节点的删除:
bool SingleList<T>::Delete(int i)
{
if(i<=0||i>n)
{
cout<<"the position is error"<<endl;
returnfalse;
}
intj=0;
Node<T>*p=first;
while(j<i-1)
{
p=p->link;
j++;
}
Node<T>*q=p->link;
p->link=q->link;//先连接好了再删除吧
free(q);//规则1,先用q保存要删除节点的地址
n--;
returntrue;
}
链表的清空:
template <classT>
SingleList<T>::~SingleList()
{
Node<T>*p=first->link,*q=NULL;//同规则1,要用q先保存当前待删除的节点
while(p!=first)
{
q=p;
p=p->link;//先找到下个节点,再将q删掉
deleteq;
q=NULL;
}
first->link=NULL;
delete[]first;
}
链表的基本操作就讲到这里,源代码可供下载http://download.csdn.net/detail/dengliangfu/6335109,vs2012的工程,你也可以把代码考出来用自己的编译器编译。

浙公网安备 33010602011771号