C语言实现双向循环链表
#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(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next) #define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next) static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
} static inline void list_add_tail(struct list_head *new_node, struct list_head *head)
{
new_node->next = head;
new_node->prev = head->prev;
head->prev->next = new_node;
head->prev = new_node;
} static inline void list_del(struct list_head *entry)
{
entry->next->prev = entry->prev;
entry->prev->next = entry->next;
entry->next = NULL;
entry->prev = NULL;
} static inline int list_empty(const struct list_head *head)
{
return head->next == head;
} //使用例子
struct stu {
int num;
char name[20];
struct list_head list;
}; int main(void)
{
struct stu *list_node = NULL;
struct list_head *pos = NULL,*n = NULL;
struct stu *pnode = NULL; struct stu *head = (struct stu *)malloc(sizeof(struct stu));
if (head == NULL) {
printf("file,%s line,%d:malloc error!\n",__FILE__,__LINE__);
exit(1);
} INIT_LIST_HEAD(&head->list); list_node = (struct stu *)malloc(sizeof(struct stu));
if (list_node == NULL) {
printf("file,%s line,%d:malloc error!\n",__FILE__,__LINE__);
exit(1);
} list_node->num = 0;
strcpy(list_node->name,"xiaoming");
list_add_tail(&list_node->list,&head->list); list_node = (struct stu *)malloc(sizeof(struct stu));
if (list_node == NULL) {
printf("file,%s line,%d:malloc error!\n",__FILE__,__LINE__);
exit(1);
} list_node->num = 1;
strcpy(list_node->name,"xiaohua");
list_add_tail(&list_node->list,&head->list); if (list_empty(&head->list)) {
printf("list is empty!\n");
} else {
list_for_each(pos,&head->list) {
pnode = list_entry(pos,struct stu,list);
printf("num:%d,name %s\n",pnode->num,pnode->name);
}
} list_for_each_safe(pos,n,&head->list) {
list_del(pos);
pnode = list_entry(pos,struct stu,list);
printf("num %d has removed from the list!\n",pnode->num);
} free(pnode); free(head);
return 0;
}
C语言实现双向循环链表的更多相关文章
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- c语言实现--双向循环链表操作
1,双向链表相当于两个单向循环链表. 2,双向链表的结点定义. 1 struct DULNode 2 { 3 int data; 4 struct DULNode * prior; 5 struct ...
- 双向循环链表(C语言描述)(四)
下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...
- 一种神奇的双向循环链表C语言实现
最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...
- 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表
1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...
- 【C语言教程】“双向循环链表”学习总结和C语言代码实现!
双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...
- c语言编程之双向循环链表
双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...
- 双向循环链表(C语言描述)(一)
双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...
- 双向循环链表涉及双向指针的基本操作(C语言)
链表大概分为有无头指针,有无尾指针,是否循环,单向还是双向, 这些都很简单,前提是你要把指针和单链表理解透彻.这些都是基于单链表 的变形,要根据实际问题,选择链表的类型. 头指针的指针域储存着储存头节 ...
随机推荐
- quick cocos2dx lua 内存释放
前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...
- sprint2 项目的粗略展示
- [问题2014A04] 解答
[问题2014A04] 解答 (1) 由条件可得 \(AB+BA=0\), 即 \(AB=-BA\), 因此 \[AB=A^2B=A(AB)=A(-BA)=-(AB)A=-(-BA)A=BA^2=B ...
- [问题2014S15] 复旦高等代数II(13级)每周一题(第十五教学周)
[问题2014S15] 设 \(O\) 为 \(n\) 阶正交阵,\(A=\mathrm{diag}\{a_1,a_2,\cdots,a_n\}\) 为实对角阵, 证明: 方阵 \(OA\) 的特征 ...
- 自定义Dialog
功能:从底部弹出的对话框,加入动画 步骤:1 定义dialog布局文件 2 设置标题,透明度style.xml,选择器selector.xml ,圆角shape.xml 等样式文件 3 设置显示位置, ...
- PHP数据类型转换 (转)
PHP数据类型转换 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: •(int).(integer):转换成整形 •(float).(double).(real):转换成浮点型 •(s ...
- WPF-非矩形窗口的创建
第一.窗口的AllowsTransparency设置为True 第二.窗口的Background设置为Transparent 第三.窗口的WindowStyle设置为None 第四.窗口内的Grid用 ...
- javaSE之Object及hashcode等相关知识
object: package javaBasic; public class TestObject { public static void main(String[] args) { // TOD ...
- SQL Server常用语句
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- ABAP之PINYING拼音
前面说了声母韵母,那么现在来说说ABAP里的拼音——域,数据元素,结构 PINGGUO = 苹果 T-CODE : SE11 如下图 域:是一些特定值的集合,或者某一种特殊用途的集合.如:需要定义 ...