线性结构的特点:再数据元素的非空有限集中
- 存在唯一的一个被称作“第一个”的数据元素
- 存在唯一的一个被称作“最后一个”的数据元素
- 除第一个之外,集合中的每个元素均只有一个前驱
- 除最后一个之外,集合中的每个元素均只有一个后继前驱
顺序表
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。 每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。因此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
优缺点:因为线性表的随机存取结构,在线性表中访问数据元素是很快的。但它的缺点也正因为它是连续的一块内存空间。所以,如果往中间添加或在中间删除一个元素,都要移动其他的元素。
#include <stdlib.h>
#include <stdio.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 0
#define OK 1
typedef struct
{
int *elem; //整型指针
int length;
int listsize;
}SqList;
int InitList_Sq(SqList &L) //构建一个空的线性表
{
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); //L.elem指向分配的内存
if (! L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE; //空线性表占用了LIST_INIT_SIZE个整型变量的内存
return OK;
}//InitList_Sq
若L是SqList类型的顺序表,这表中第i个数据元素是L.elem[i-1]:???
(Sqlist &L)与(Sqlist L)的区别:形参不同,把&看成指针,对Sqlist &L如果函数中对顺序表内的数据有修改这时的数据的变化是能带回来的,如果用(Sqlist L)就不能带回来。
链表
- 线性链表(指针实现/静态)
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。
//----线性表的单链表存储结构----
typedef struct LNode //链式结构,使用指针
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//----线性表的静态单链表存储结构----
#define MAXSIZE 1000 //链表的最大长度
typedef struct //链式结构,不使用指针,利用一维数组代替
{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
静态单链表存储结构仍需要预先分配一个较大的空间,但在做线性表的插入和删除操作是不需要移动元素,仅需要修改指针,故仍具有链式存储结构的主要优点。
静态链表的插入和删除:为了辨明数组中哪些分量未被使用,解决的办法是将所有未被使用过以及被删除的分量用游标链成一个备用的链表,每当进行插入是便可重备用链表上取得第一个结点作为待插入的新结点;反之,在删除时将从链表中删除下来的结点链接到备用链表上。
循环链表
表中最后一个结点的指针域指向头结点,整个链表形成一个环。因此,从表中任一结点出发均可找到表中其他结点。双向链表
双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。
//----线性表的双向链表存储结构----
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;