线性表的链式表示--双链表、循环链表、静态链表

1 双链表

双链表结点中有两个指针prior和next,分别指向其前驱结点和后继节点。
双链表中结点类型的描述如下:

typedef int ElemType;
typedef struct DNode {
    ElemType data;
    struct Dnode *prior, *next;
} DNode, *DLinkList;

1)双链表的插入操作
在双链表中p所指的结点之后插入结点s。
①s->next = p->next;
②p->next->prior = s;
③s->prior= p;
④p->next = s;
上述代码语句顺序不是唯一的,但也不是任意的,①②两步必须在④之前,否则
p的后继结点的指针就丢掉了。
2)双链表的删除操作
删除双链表中结点p的后继结点q。
p->next = q->next;
q->next->prior= p;
free(q);

2 循环链表

1.循环单链表
循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。
在循环单链表中,表尾结点r的next域指向L,故表中没有指针域为NULL的结点,因此循环单链表的判空条件不是头结点的指针是否为空,而是它是否等于头指针。
2.循环双链表
在循环双链表中,头结点的prior指针还要指向表尾结点。
在循环双链表L中,某结点
p为尾结点时,p->next = L;当循环双链表为空表时,其头结点的prior域和next域都等于L。

3 静态链表

静态链表是借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,与前面所讲的链表中的指针不同的是,这里的指针是结点的相对地址(数组下标),又称为游标。和顺序表一样,静态链表也要预先分配一块连续的内存空间。
静态链表结构类型的描述如下:

#define MAXSIZE 100
typedef int ElemType;
typedef struct {
    ElemType data; //存储数据元素
    int next;    //下一个元素的数组下标
} SLinkList[MAXSIZE];

静态链表以next = -1作为其结束的标志。静态链表的插入、删除操作与动态链表相同,只需要修改指针,而不需要移动元素。总体来说,静态链表没有单链表使用起来方便,但是在一些不支持指针的高级语言中,这又是一种非常巧妙的设计方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,979评论 0 13
  • 转自:http://blog.csdn.net/oreo_go/article/details/52116214 ...
    YYT1992阅读 1,034评论 0 4
  • 第二篇周记。拖了一个多月才写第二篇,没啥好说的就是懒病犯了。鼓起勇气继续写,这一篇可以算作这一段时间的总结,从3....
    罗小蔚阅读 189评论 0 0
  • 年近30的我把从乡下来的老爸送上了北京冰冷的地铁 父亲一个人去坐回老家的火车 坚持不让买高铁坚持不让买卧铺 我坚持...
    eelq阅读 493评论 1 1
  • 建国后动物不能成精,却没规定妖不能成人。于是魑魅魍魉化而为人,不单走得霸道,还要骑车飞驰!世有一宝物,名曰共享单车...
    大为君David阅读 662评论 12 17