作为一个C开发人员,无论在求职笔试题中,还是在工程项目中,都会遇到用c语言创建双向环形链表。这个也是理解和使用c指针的一项基本功。

#include<...>//头文件省略

typedef struct ringbuf_str
{
unsigned int ringID; /* ring ID*/
struct ringbuf_str *next; /* Next ringbuf in list */
struct ringbuf_str *pre; /* Previous ringbuf in list */
} RINGBUF_T;

RINGBUF_T *Init_Ringbuf(int len)
{
RINGBUF_T *pCurrent=null;
RINGBUF_T *pHead=null;
RINGBUF_T *pPrevious=null;
int i=0;

//@1.创建链表头pHead
pCurrent = (RINGBUF_T *)calloc(sizeof(RINGBUF_T),1);
if(pCurrent == null)
{
return null;
}
pHead = pCurrent;
pPrevious = pCurrent;
//初始化表头内容
pHead->pre = pCurrent;
pHead->next = pCurrent;
pHead->ringID = 0;

//@2.创建链表体.
for(i=1;i<len;i++)
{
pCurrent = (RINGBUF_T *)calloc(sizeof(RINGBUF_T),1);
if(pCurrent == null)
{
return null;
}

pPrevious->next = pCurrent;
pCurrent->pre = pPrevious;
pCurrent->ringID = i;

pPrevious = pCurrent;
}
//@3.链表首尾相接,形成环形链表
pHead->pre = pCurrent;
pCurrent->next = pHead;

return(pHead);
}
//删除链表
int Release_Ringbuf(RINGBUF_T *ringbuff,int len)
{
RINGBUF_T *pCurrent = null;
RINGBUF_T *pPrevious = null;
int i = 0;

if(ringbuff == null)
return -1;

pCurrent = ringbuff;

for(i=0;i<len; i++)
{
pPrevious = pCurrent;
pCurrent = pCurrent->next;
free(pPrevious);
}
pCurrent = IC_NULL;
pPrevious = IC_NULL;

return 0;
}
//main函数
int main(void)
{
#define RINGBUFFLEN 10
RINGBUF_T *ringbuff=null;

//@1.初始化一个链表,长度为RINGBUFFLEN
ringbuff=Init_Ringbuf(RINGBUFFLEN);

//@2. do some operations
//...

//@3.释放该链表
Release_Ringbuf(ringbuff,RINGBUFFLEN);

return 0;
}

用c语言创建双向环形链表的更多相关文章

  1. Leecode刷题之旅-C语言/python-141环形链表

    /* * @lc app=leetcode.cn id=141 lang=c * * [141] 环形链表 * * https://leetcode-cn.com/problems/linked-li ...

  2. 单链表的插入伪算法和用C语言创建单链表,并遍历

    非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p-> ...

  3. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  4. php实现单,双向链表,环形链表解决约瑟夫问题

    传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...

  5. 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)

    链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...

  6. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  7. 丢手帕问题(环形链表)---Java 待优化

    /** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...

  8. java 环形链表实现约瑟夫(Joseph)问题

    约瑟夫问题又名丢手绢问题.相传著名犹太历史学家 Josephus 利用其规则躲过了一场自杀游戏,而后投降了罗马. 问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.* 从编号为 ...

  9. LeetCode 141:环形链表 Linked List Cycle

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Given a l ...

随机推荐

  1. linux之关于学习必备知识

    文件列表的定义: 第一个字符表示文件类型  d为目录  -为普通  1为链接  b为可存储的设备接口  c为键盘鼠标等输入设备 2~4个字符表示所有者权限,5~7个字符表示所有者同组用户权限,8~10 ...

  2. MAVEN项目不扫描mybatis的mapper.xml问题

    在使用maven+mybatis+spring在开发的时候,遇到问题,总是找不到mapper.xml文件里定义的方法.检查后发现maven编译后并没有将xml文件打包到输出路径,导致bean创建失败. ...

  3. 执行monkey APK 制作

    一.主布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  4. URL tomcat中文乱码

    <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" conn ...

  5. pytorch怎么抽取中间的特征或者梯度

    for i, (input, target) in enumerate(trainloader): # measure data loading time data_time.update(time. ...

  6. Vue中添加新的路由并访问

    1.搭建好Vue脚手架(这里使用的版本是Vue2.0) 2.在代码编辑器(这里使用的是Sublime Text)打开项目文件夹 3.在文件目录src中的component下创建一个新的vue页面,写入 ...

  7. git版本管理工具常用命令

    git是分布式版本管理工具,一台电脑既可以是客户端,也可以是服务端.工作过程中可以断开网络.svn是集中式版本管理工具,一台服务器控制很多客户端,使用过程不能断网. git的优点有:适合分布式开发,强 ...

  8. tab切换 原生js

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 安装grub到U盘分区,实现多系统引导

    目录 1.分区工具及分区类型 1.1 显示分区表和分区信息 1.1.1 fdisk -l 1.1.2 gdisk -l 1.1.3 parted -l 1.2 常见分区类型 1.3 分区样例 1.3. ...

  10. gdb 调试 python

    gdb 版本 >7 的 对python调试有特别支持,参考: https://docs.python.org/devguide/gdb.html?highlight=gdb https://bl ...