大话数据结构学习笔记(三)

来源:互联网 发布:zlbog php代码编辑 编辑:程序博客网 时间:2024/05/16 18:22

线性表(List):零个或多个数据元素的有限序列。

是一个序列。元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。

元素的个数是有限的。


线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

线性表的顺序存储的结构代码:

#define MAXSIZE 20

typedef int ElemType;

typedef struct

{

ElemType data[MAXSIZE];

int lenght;

}SqList;

顺序存储结构线性表的第i个元素存储在数组下标为i-1的位置。存取时间性能为O(1),随机存储结构。

线性表的顺序存储结构,在存、读数据时,时间复杂度为O(1),插入或删除时,最好为O(1),平均为O(n),最坏为O(n)。

线性表顺序存储结构优点:

1、无须为表示表中元素之间的逻辑关系增加额外的存储空间。

2、可以快速地存取表中任一位置的元素。

缺点:

1、插入和删除操作需要移动大量元素。

2、当线性表长度变化较大时,难以确定存储空间的容量。

3、造成存储空间的“碎片”。


链表中第一个节点的存储位置叫做头指针。

在单链表的第一个节点前附设一个节点,称为头结点。头节点的数据域可不存储任何信息,也可存储如线性表长度等附加信息,头结点的指针域存储指向第一个结点的指针。

头指针:

1、头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。

2、头指针具有标识作用,所以常用头指针冠以链表的名字。

3、无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

头结点:

1、头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义。

2、有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了。

3、头结点不一定是链表必须要素。

在C中可用结构指针来描述单链表

typedef struct Node

{

ElemType data;

struct Node *next;

}Node;

typedef struct Node *LinkList;


单链表结构和顺序存储结构对比:

1、存储分配方式:顺序存储结构用一段连续的存储单元依次存储线性表的数据元素;单链表此阿勇链式存储结构,用一组任意的存储单元存放线性表的元素。

2、时间性能:查找:顺序存储结构O(1)单链表O(n);插入和删除:顺序存储结构需要平均移动表长一半的元素,时间为O(n)单链表在选出某位置的指针后,插入和删除时间仅为O(1)。

3、空间性能:顺序存储结构需要预分配存储空间,大了浪费,小了上溢;单链表不需要预分配存储空间。


用数组描述的链表叫做静态链表(游标实现法)。

静态链表优点:在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。

缺点:1、没有解决连续存储分配带来的表长难以确定问题2、失去了顺序存储结构随机存取的特性。


循环链表(circular linked list):将单链表中终端结点的指针由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称为循环链表。

双向链表(double linked list):是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

0 0
原创粉丝点击