1、链表

  链表所分配的空间在内存上不一定连续,但是链表具有其天然优势。

  链表分为4种情况,单链表,单循环,双链表,双循环链表;

各自模型如下:

(1)、单链表

(2)、单循环链表

(3)、双链表

(4)、双循环链表

2、链表上的操作

  单链表分为2种情况:

带头结点链表

不带头结点链表

链表上常见操作:创建链表、插入链表,删除链表,查找数据,修改数据,销毁链表.......

对单链表的操作,我以后在C语言版数据结构在实现,其实这4种链表实现机制差不多,对其操作的思想也都一样。在这里我就只实现双向循环链表;

3、双向循环链表的实现

(1)、模型如下:

思路:链表结点类型,然后就是双向循环链表的控制头,在进行具体的各种函数的编写。

C++写函数,最好,类内声明函数,类外定义函数;

关于其下的函数名称:保持与STL中的函数名称一致,更利于学习STL;

C++实现了部分函数功能:

#ifndef _DCLINK_H_
#define _DCLINK_H_

#include
#include
using namespace std;

template
class DCLink;

template
class DCLinkNode{  //这是双向循环链表的结点类型
    friend class DCLink;
public:
    DCLinkNode(Type x = 0){
        prev = next = NULL;
        data = x;
    }
    ~DCLinkNode(){
    
    }
private:
    Type data; //数据域
    DCLinkNode *prev; //前驱结点指针
    DCLinkNode *next; //下一个结点指针
};

template
class DCLink{
public:
    DCLink(){  //初始化对象的构造函数
        DCLinkNode *s= new DCLinkNode;
        first = last = s;
        s->next = first;
        s->prev = last;
        size = 0;
    }
    ~DCLink(){
    
    }
public:  
    bool push_back(const Type &); //尾随函数
    void show_link()const;  //显示链表 
    bool push_front(const Type &);  //前插函数
    bool insert_val();  //根据值得插入
    bool pop_back();  //删除最后一个结点
private:
    bool insert_pos();
private:
    DCLinkNode *first;  //永远指向链表第一个结点
    DCLinkNode *last;   //永远指向链表的最后一个结点
    size_t size;  //统计结点个数,不算没有数据的第一个;
};
template
bool DCLink::push_back(const Type &x){
    DCLinkNode *s = new DCLinkNode(x);
    if(s == NULL){
        return false;
    }
    s->next = first;
    s->prev = last;
    last->next = s;
    first->prev = s;
    last = s;
    size++;

    return true;
}
template
void DCLink::show_link()const{
    DCLinkNode *p = first->next;

    while(p != first){
        cout<data<<"--> ";
        p = p->next;
    }
    cout<<"NULL"<
bool DCLink::push_front(const Type &x){
    DCLinkNode *s = new DCLinkNode(x);
    if(s == NULL){
        return false;
    }
    s->next = first->next;
    first->next->prev = s;
    s->prev = first;
    first->next = s;
    size++;

    return true;
}
template
bool DCLink::insert_val(){
    int number1;
    int number2;

    cout<<"请输入要插入位置的值 :";
    cin>>number1;
    cout<<"请输入要插入的数据";
    cin>>number2;

    DCLinkNode *p = first->next;
    DCLinkNode *s = new DCLinkNode(number2);
    while(p != first){
        if(p->data == number1){
             s->prev = p->prev;
             s->next = p;
             p->prev->next = s;
             p->prev = s;
             size++;
        }
        p = p->next;
    }

    return true;
}
template
bool DCLink::pop_back(){
    DCLinkNode *tmp = last->prev;
    DCLinkNode *tmp1 = last;
    
    tmp->next = first;
    first->prev = tmp;
    last = tmp;
    size--;

    delete tmp1;
    tmp1 = NULL;

    return true;
}

#endif

(2)、测试代码

#include
#include"dclink.h"
using namespace std;

int main(void){
    DCLink dc;
    
    for(int i = 0; i < 10; i++){
        dc.push_back(i);
    }
    dc.push_front(-1);
    dc.show_link();
    dc.insert_val();  //均是前插
    dc.show_link();
    dc.pop_back();
    cout<<"删除最后一个结点时如下: "< 
  

(3)、测试结果

4、分析

  链表的插入,删除,销毁,查找之类的关键在纸上画出图形,即可解决;

  销毁:从头往后删除链表结点;