一、线性表
1、线性表的定义及运算
线性表是信息表的一种形式,表中数据元素之间满足线性关系(或线性结构),是一种最基本、最简单的数据结构类型。
线性表的定义是描述其逻辑结构,而运算是讨论在线性表上进行的查找、插入、删除等操作。
2、线性表的特征
对非空表,a0是表头,无前驱;
an-1是表尾,无后继;
其它的每个元素ai有且仅有一个直接前驱(ai-1)和一个直接后继(ai+1)。二、链表
1、链表的定义
线性表的链式存储结构,即链表。
将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构。表中元素ai的结点形式如图所示:
其中,结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。于是,线性表L=( a0,a1,……,an-1)的结构如图所示:
2、结点类型描述
typedef int data_t;
typedef struct node_t
{ data_t data; //结点的数据域//
struct node_t *next; //结点的后继指针域//
}linknode_t, *linklist_t;若说明linknode_t A;linklist_t p = &A;则结构变量A为所描述的结点,而指针变量p为指向此类型结点的指针(p的值为结点的地址),如图所示:。
3、结点的获取
设p指向链表中结点ai,如图所示:,获取ai,写作:p->data;而取ai+1,写作:p->next->data。另外,若指针p的值为NULL,则它不指向任何结点,此时取p->data或p->next是错误的。可调用C语言中malloc()函数向系统申请结点的存储空间,例如:linklist_t p;p = (linklist_t)malloc(sizeof(linknode_t));则创建一个类型为linknode_t的结点,且该结点的地址已存入指针变量p中:。
4、建立单链表
算法思路:依次读入表L=(a0,.....,an-1)中每一元素ai(假设为整型),若ai≠结束符(-1),则为ai创建一结点,然
后插入表尾,最后返回链表的头结点指针H。5、链表查找
a、按序号查找:实现GetLinklist(h, i)运算。
算法思路:从链表的a0起,判断是否为第i结点,若是则返回该结点的指针,否则查找下一结点,依次类推。b、按值查找(定位) : 即实现Locate(h, x)。
算法思路:从链表结点a0起,依次判断某结点是否等于x,若是,则返回该结点的地址,若不是,则查找下一结点a1,依次类推。若表中不存在x,则返回NULL。6、链表的插入:即实现InsertLinklist(h, x, i,)。将x插入表中结点ai之前的情况。
算法思路:调用算法GetLinklist(h, i-1),获取结点ai-1的指针p(ai 之前驱),然后申请一个q结点,存入x,并将
其插入p指向的结点之后。7、链表的删除:即实现DeleteLinklist(h, i), 算法对应的链表结构如图2.15所示。
算法思路:同插入法,先调用函数GetLinklist(h, i-1),找到结点ai的前驱,然后将结点ai删除之。8、单链表H倒置
算法思路:依次取原链表中各结点,将其作为新链表首结点插入H结点之后。