您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习心得(二)-----线性表

2014-07-10 20:45 246 查看
线性表是由n个数据元素(结点)a1,a2,a3……an组成的有限序列。

线性表的数据元素ai所代表的具体含义随具体应用的不同而不同,在线性表的定义中,只不过是一个抽象的符号。

1.线性表的结点可以是单值元素(每个元素只有一个数据项)例如:26个英文字母表(A,B,C……Z)扑克的点数(2,3,4,5……J,Q,K)

2.线性表中的结点可以是记录型元素,每个元素含有多个数据项,每个项称为结点的一个域,每个元素有一个可以唯一标识每个结点的数据项组,称为关键字。

例子:某校2001级同学的基本情况{(‘201112’,‘张三’,‘男’,‘1983/2/4’),('201113','章华寺‘,’男‘1984/2/8)……}

顺序线性表:数组表示粗出线性表的元素,顺序表还需要长度的属性,所以用结构类型来定义顺序表类型。

typedef struct sqlist
{
ElemType Elem_array[MAX_SIZE];
int length;
}Sqlist;


链式线性表:为了正确表示节点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针或链

链表是通过每个节点的指针域将线性表的n个节点按其逻辑次序链接在一起的。每一个结点只包含一个指针域的链表,称为单链表。

为操作方便,总是在链表的第一个节点之前附设一个头结点(头指针)head指向第一个结点。头结点的数据域可以不存储任何信息(或链表长度等信息)。



结点的描述与实现

typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}LNode;
结点的实现:结点是通过动态分配和释放来实现的,即需要时分配,不需要时释放。实现时分别使用的c语言标准函数为:malloc(),realloc(),sizeof(),free();

p=(LNode*)malloc(sizeof(LNode));函数malloc分配了一个类型为LNode的节点变量的空间,并将其首地址放入指针变量p中。

动态释放free(p);系统回收由指针变量p所指向的内存区,p必须是最近一次调用malloc函数时的返回值。

单链表 循环链表 双向链表 双向循环链表,这是四个基本链表的形式。

单链表

typedef struct Lnode

{ ElemType data; /*数据域,保存结点的值 */

struct Lnode *next; /*指针域*/

}LNode; /*结点的类型 */



双向链表

typedef struct Dulnode

{ ElemType data ;

struct Dulnode *prior , *next ;

}DulNode ;//就是多了一个前指向



最常用的基本操作。

1.结点的赋值LNode *p;p=(LNode*)malloc(sizeof(LNode));p->data=20;p->next=NULL;

2.指针操作。1.q=p 2.q=p->next 3.p=p->next 4.q->next=p; 5.q->next=p->next;

单链表的查找:1.按序号查找2.按值查找

单链表的插入

单链表的删除:1.按序号删除2.按值删除

链表上实现插入和删除运算,无需移动结点,仅需修改指针。解决了顺序表的插入或删除操作需要移动大量元素的问题。

变形题目:删除单链表中值为key的所有节点。删除单链表中所有值重复的节点,使得所有节点的值都不相同。

单链表的合并

指针除了定义的时候加*表示是指针变量外,其他时候加*表示指向的内容,不加星号表示的地址。

循环链表:是一种头尾相接的链表。其特点是最后一个结点的指针域指向链表的头结点,整个链表的指针域链接成一个环

从循环链表的任意一个结点出发都可以找到链表的其他结点,使得表处理更加方便灵活。

循环链表的操作:对于单循环链表,除链表的合并外,其他的操作和单链表基本一致,仅仅需要在单线性链表操作算法基础上作以下简单修改:

1.判断是否为空链表:head->next==head;2.判断是否是表尾结点:p->next==head;

双向链表:构成链表的每个节点中设立两个指针域:一个指向其直接前趋的指针域prior,一个指向其直接后继的指针域next,这样形成的链表中有两个不同的链,故称双向链表。双向链表一般增加头指针也能使双链表的某些运算变得方便。

将头节点和尾结点连接起来也能构成循环链表,并称之为双向循环链表。

双向链表是为了客服单链表的单向性的缺陷而引入的。

双向链表结构具有对称性,设p指向双向链表中的某一结点,其对称性用下式表示:(p->prior)->next=p=(p->next)->prior;

双向链表的插入:1.如果插入时仅仅指出其直接前驱结点,钩链时必须注意先后顺序是“先右后左”2.插入时同时指出直接前驱结点p和直接后继结点q,钩链时无须注意先后次序。

双向链表的结点删除:设要删除的节点为p,删除时可以不引入新的辅助指针变量,可以直接先断链,在释放结点。

语句如下:p->prior->next=p->next;p->next-prior=p->prior;free(p);

与单链表的插入和删除操作不同的是,在双向链表中插入和删除必须同时修改两个方向上的指针域的指向。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: