数据结构之线性结构

数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构(或物理结构)。

基本的数据结构:

1. 线性表

I. 顺序存储结构

线性表的顺序存储是指用一组地址连续的存储单元一次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻,如下图所示。在这种存储方式下,元素间的逻辑关系无须占用额外的空间来存储。

II. 链式存储结构

线性表的链式存储是用结点来存储数据元素,基本的结点结构如下所示:

其中,数据域用于存储数据元素的值,指针域则存储当前元素的直接前驱或直接后继的位置信息,指针域中的信息称为指针(或链)。

a. 单链表

    

    单链表的结点删除

    步骤:

      (1) q = p ->link;  令临时指针q指向带删除的结点

      (2) p->link = p->link->link;  修改p所指结点的指针域为指向p所指结点的后继的后继结点,从而将元素b所在的结点从链表中删除

      (3) free(q);  释放q所指结点的空间

    单链表结点的插入

    步骤:

      (1)s->link= p->link;  将s所指结点的指针域指向p的后继结点

      (2)p->link = s;   将p所指结点的指针域修改为指向s所指结点

 b. 双链表(有两个指针域)

    双链表结点的删除

    步骤: 

      (1)p->front->next = p->next;

      (2)p->next->front = p->front;

      (3)free(p);

    双链表结点的插入

    步骤: 

      (1)q->front = p;

      (2)q->next = p->next;

      (3)p->next = q; 

      (4)p->next->front = q;      

 

 

顺序表与链表的比较:

 

2. 栈

  栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。栈又称为后进先出(Last In First Out, LIFO)的线性表。在栈中进行查如何删除操作的一端称为栈顶(top),另一端成为栈底(bottom)。

3. 队列

  队列市一中先进先出(First In First Out, FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端成为队尾(rear),允许删除元素的一端称为队头(front)。

  在顺序队列中,为了降低运算的复杂度,元素入队时至修改队尾指针,元素出队时只修改队头指针。由于顺序队列的存储空间容量是提前设定的,所以队尾指针会有一个上限值,当队尾指针达到该上限值时,就不能只通过修改队尾指针来实现新元素的入队操作了。此时,可通过整除取余运算将顺序队列假想成一个环状结构,如下图所示,称之为循环队列。

设循环队列Q的容量为M,初始时队列为空,且Q.rear和Q.front都等于0,如下图(a)所示。

  元素入队时,修改队尾指针Q.rear = (Q.rear + 1) mod M, 如下图(b)所示;

  元素出队时,修改队头指针Q.front = (Q.front + 1) mod M, 如下图(c)所示;

根据队列操作的定义,当初对操作导致队列变为空时,则有Q.rear==Q.front,如下图(d)所示;若入队队列操作导致队列满时,则Q.rear==Q.front,如下图(e)所示;

原文地址:https://www.cnblogs.com/ImaY/p/4274334.html