链表的基本操作

    链表可谓是数据结构中最重要的一个部分。从我个人的学习经验来看,只要对链表的操作了解了,学习后面的数据结构就会感觉到非常得有趣和轻松。最近老有同学说链表好复杂,其实链表就是数据结构里面最基础也是最简单的结构了。下面我就对链表说下我的想法吧,大神路过莫笑!!!个人意见欢迎拍砖(^_^)。。

 

    线性表的链式表示方式就叫做链表。相比大家都知道数据结构可简单描述为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的工程,你也可以把代码考出来用自己的编译器编译。



 

posted @ 2013-09-28 22:20  旧客图新  阅读(295)  评论(0)    收藏  举报