考研c++数据结构 线性表高分复习笔记

基础概念

A1-A2-A3-...An 数据元素被一条线串起来

定义

线性表是具有相同特性数据元素的有限序列

相同特性 把同一类事物归类,方便批量处理

有限 表中元素个数为n,n有限大,n可以为0

序列 表中元素排成一排,体现了一对一的逻辑特性(每个元素有且仅有一个前驱和后继)

存储结构

顺序结构

利用数组来实现顺序的存储,使用位置关系来体现逻辑关系

A

B

C

...

X

...

 

0

1

2

...

lengh-1

...

maxsize

链式存储结构结构(单链表)

每个元素之间散列,通过其他的位置信息(指针)指向下个元素

typedef struct LNode

{

int data; //存储数据

struct LNode *next; //指针,存储指向下一个单元的存储信息

}LNode;

LNode *L;

L=(LNode*)malloc(sizeof(LNode));

A->next = B; B->next = C; C->next = D;

常用的两类单链表

A结点为开始节点 C结点为尾结点

1.head-[ |*next]-[A|*next]-[B|*next]-[C|NULL]

含有头节点的链表(实际中都是用这个)

当Head->next==NULL时,为空链表

2.head-[A|*next]-[B|*next]-[C|NULL]

不含头节点的链表

当Head==NULL时,为空链表

找一个结点的前驱结点时,需要从头指针遍历,非常麻烦

若想要每个结点都可以快速找到前驱结点,需要再加一个前驱指针

链式存储结构(双链表)

每个结点增加了前驱指针

typedef struct DLNode

{

int data;

struct DLNode *next;

struct DLNode *prior;

}DLNode;

DLNode *L;

L = (DLNode)malloc(sizeof(DLNode));

A->next = B; B->next = C; C->next = D;

D->prior = C; C->prior = B; B->prior = A;

双链表也同样包括含有头结点的链表和不含有头节点的链表

双链表在找前驱时会更好找,但如果头结点受损,单链表无法找到头结点,双链表需要遍历整个链表

链式存储结构(循环链表)

将最后一个结点的空指针指向头结点

单链表->单循环链表

Head->next == head 链表为空

双链表->双循环链表

Head->next == head或

Head->prior == head 链表为空

对于不含头结点的链表,当Head==NULL时,链表为空

所以循环链表不论什么情况下都不会存在空指针

猜你喜欢

转载自blog.csdn.net/gangangan0001/article/details/82911640