Myintelex

  • 主页
  • 所有文章
  • 标签云
  • 个人简历

Myintelex

Myintelex

  • 主页
  • 所有文章
  • 标签云
  • 个人简历

线性表的实现--链表

2016-11-30

线性表是最常用最简单的一种线性数据结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列。通常我们见到的有:数组,链表。而链表又分为单链表、双链表等不同种类。

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。

typedef struct node {
    datatype data;
    struct node * next;
}listnode;

单链表创建

通常我们创建一个空链表的时候指的是我们创建了一个头结点,这个节点指向了链表的第一个节点。

listnode * list_create() {
    listnode * H;

    H = (listnode *)malloc(sizeof(listnode));
    if (H == NULL) {
        printf("malloc failed!\n");
        return NULL;
    }

    H->data = 0;
    H->next = NULL;

    return H;
}

单链表的操作

链表的操作通常有增删改查等:
具体的实现代码在这里不再呈现,相应的操作逻辑是:
增:在指定的节点A后添加节点B是创建一个新的节点B,将此B节点的指针指向指定位置节点A的下个节点,再将指定位置节点A的指针指向节点B。
删:删除指定节点A首先找到A的上个节点B,将B节点的指针指向A的下个节点C,随后释放A节点空间。

双向链表

双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

template<class T> 
struct DuLNode
{
    T data;
    DuLNode *prev;
    DuLNode *next;
};

双向链表的相应操作

创建:双向链表的创建同样是创建了一个空节点,此时链表指针指向和此节点的头尾指针均指向当前节点

template<class T>
DoubleLink<T>::DoubleLink() : count(0)
{
    // 创建“表头”。注意:表头没有存储数据!
    phead = new DNode<T>();
    phead->prev = phead->next = phead;
    // 设置链表计数为0
    //count = 0;
}

增:在指定的节点A,B中间添加节点C是创建一个新的节点C,将此C节点的头指针指向节点A尾指针指向B,再将A的尾指针B的头指针指向C。
删:删除AC节点中间的B节点是将A节点的尾指针指向C,将C节点头指针指向A,释放B节点

栈

Stack是一种常用的线性结构,主要有以下两个特点:

  • 栈中的数据是按照后进先出(LIFO)的顺序进行操作的
  • 向栈中添加数据和删除数据只能在栈顶进行操作

    队列

    Queue是另外一种常见的线性结构,主要有以下两个特点:

  • 队列中数据是按照”先进先出(FIFO)”方式进出队列的。
  • 队列只允许在”队首”进行删除操作,而在”队尾”进行插入操作。
  • 数据结构
  • 线性表
数据结构

扫一扫,分享到微信

微信分享二维码
Google C++ Style Guide
环境变量总结
© 2020 Myintelex
Hexo Theme Yilia by Litten