线性表的顺序存储和链式存储

一、线性表是一种逻辑数据结构。

线性表是最基本、最简单、也是最常用的一种数据结构。 

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
 
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

二、线性表的实现。线性表的顺序存储结构和线性表的链表存储结构。

2.1、顺序存储

所谓顺序存储,是用数组来实现的,在内存中分配一块连续的地址区间,将数据按顺序存储到该数组中;

a1 a2 a3 a4 a5 ...... ai-1 ai

......

an

存储结构如下:

#define MAXSIZE 20

typedef int ElemType ;

typedef struct

{

      ElemType data[MAXSIZE] ;

      int length ;

}SqLst ;

2.2、单链表结构

线性表的链式存储结构每个数据元素包含两部分信息,一部分是数据信息,叫做数据域;一部分是指针域,存放后继元素的地址信息。

每个链表有一个头指针,指向链表的第一个元素;链表的最后一个元素的指针域为NULL。有的链表包含头结点、有的链表不包含头结点。头结点并不是真正意义上的第一个结点,因为它的数据信息是没有意义的。

单链表结构描述:

typedef struct Node

{

     ElemType data ;

     struct Node *node ;

}Node ;

typedef struct Node *LinkList ;

LinkList L :这里的L其实就相当于链表的头指针,指向这个链表。如果是没有头结点的链表,那么L就是指向的第一个结点,L->data为第一个结点的数据域;L->next为第二个节点。但是如果链表是有头结点的,L->next才是第一个结点。

LinkList *L :这里的L是指向链表的头指针的指针,*L才是链表的头指针,因此如果没有头结点的链表,那么(*L)就是指向第一个结点,(*L)->data就是第一个结点的数据域;如果是带有头结点的链表,(*L)->next为第一个结点。

原文地址:https://www.cnblogs.com/chenweichu/p/6405920.html