c语言实现--双向循环链表操作】的更多相关文章

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性…
1,双向链表相当于两个单向循环链表. 2,双向链表的结点定义. 1 struct DULNode 2 { 3 int data; 4 struct DULNode * prior; 5 struct DULNode * next; 6 }; 7 8 typedef struct DULNode * linklist; 3,单循环链表的操作都适用于双循环链表.4,双循环链表的操作集合仍在头文件defs.h中. 5,InitList操作.双循环链表初始化操作示意图 1 #include"defs.h…
1,什么叫单向循环链表.单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空. 2,由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头. 3,链表的结点表示 1 struct LNode 2 { 3 int data; 4 struct LNode * next; 5 }; 6 typedef struct LNode * linklist 4,单向循环链表的操作集合,仍是defs.h里的操作集合,这里就不给出了. 5,单循环链表的初始化操作.示意图 实现…
#include <stdio.h> #include <stdlib.h> #include <string.h> struct list_head { struct list_head *next, *prev; }; #define list_entry(ptr, type, member) \ (type *)( (char *)ptr - ((size_t) &((type *)0)->member)) #define list_for_each…
1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() { s1 := []int {1,2} s2 := []int{3,4,5,6} //copy的是角标,不会增加元切片的长度 copy(s1,s2) fmt.Println(s1) //[3 4] fmt.Println(s2) //[3 4 5 6] } (2)把短切片拷贝到长切片中 package ma…
双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和尾节点)这是和双向链表不同的地方.我们看下双向循环链表的示意图(我在网上找了张图片,自己画的实在难看,有时间真的要去学下怎么画图了,然后可以写出更好的博客): 在程序的编写方面呢,双向循环链表有点向前面知识的组合,双向循环链表在“双向”方面和双向链表一样,在“循环方面”和单向循环链表一样.以前的知识…
下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入.删除.查找.查找和获取链表元素操作. 在程序初始化时,除了初始化链表,还要将保存在文件中的词库加载到链表中: void dict_init() { list = linkedlist_new(); dict_load(); printf("Welcome."); } 函数dict_load…
最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向循环链表了.一般的实现方式如下: typedef struct link_node { ele_type element; link_node *prev, *next; } link_node; ... // 相关的操作比较简单,这里就不实现了 但是这样有一定的局限性,就是里面的数据域(eleme…
1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 ? 1 2 3 4 5 6 7 8 9 10 11 12 package main   import "fmt"   func main() {     s1 := []int {1,2}     s2 := []int{3,4,5,6}     //copy的是角标,不会增加元切片的长度     copy(s1,s2)     fmt.Println(s1)        //[…
双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿,如图所示:   需要注意的是,虽然双向循环链表成环状,但本质上还是双向链表,因此在双向循环链表中,依然能够找到头指针和头节点等.双向循环链表和双向链表相比,唯一的不同就是双向循环链表首尾相连,其他都完全一样. 注意:因为我上面已经讲了双向链表,所以这里只注重讲他们的实现差异.另因为带头节点会更好操…