list.h链表练习
2014-03-26 21:07
232 查看
基于list.h写了一段小程序,果然短小精悍,以后链表就直接用它了。通常使用struct list_head ,应该是将其作为自定义结构体中的一部分。
有几个比较难理解的宏:
INIT_LIST_HEAD();声明一个链表头;
list_for_each (..) 遍历组成list_head链表的每个元素;
list_entry(...) 通过结构体某一个成员的指针,推算出整个结构体的起始地址,这是个很实用的做法;关键在于理解
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
其实就相当于 &((struct test *) object)>MEMBER; 注意->的优先级比 & 高,之前因为这个困惑了很久,以为对0地址再取地址,后来才明白是对MEMBER变量取地址。因为结构体起始地址为0,所以取得的这个值即是相对结构体起始地址的偏移。
list_for_each_entry ,相当于list_for_each和list_entry的组合使用,直接返回包含struct list_head的 父结构;
有几个比较难理解的宏:
INIT_LIST_HEAD();声明一个链表头;
list_for_each (..) 遍历组成list_head链表的每个元素;
list_entry(...) 通过结构体某一个成员的指针,推算出整个结构体的起始地址,这是个很实用的做法;关键在于理解
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
其实就相当于 &((struct test *) object)>MEMBER; 注意->的优先级比 & 高,之前因为这个困惑了很久,以为对0地址再取地址,后来才明白是对MEMBER变量取地址。因为结构体起始地址为0,所以取得的这个值即是相对结构体起始地址的偏移。
list_for_each_entry ,相当于list_for_each和list_entry的组合使用,直接返回包含struct list_head的 父结构;
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h" /*** *使用list.h 实现链表数据排序 * */ #define MAX_NAME_LEN 10 struct mylist { int num; char name[MAX_NAME_LEN]; struct list_head list; }; /** * 通过内嵌list_head组织成一个双向链表 * */ struct mylist head; int main(int argc,char *args[]) { int i; struct list_head *pos; struct mylist *stack_list; struct mylist *iterate_pos; INIT_LIST_HEAD(&(head.list)); for(i=0;i<10;i++) { stack_list = (struct mylist *)malloc(sizeof(struct mylist)); stack_list->num = i+10; list_add(&(stack_list->list),&(head.list));// list_add looks like a stack } // 使用list_for_each 先获取list_head指针,再使用list_entry获取父结构指针 list_for_each(pos,&(head.list)) { iterate_pos = list_entry(pos,struct mylist,list); printf("%d->",iterate_pos->num); } printf("\n"); //backward iterate printf("backward iterate stack!\n"); list_for_each_prev(pos,&(head.list)) { iterate_pos = list_entry(pos,struct mylist,list); printf("%d->",iterate_pos->num); } printf("\n"); // iterate and replace one inode printf("replace one inode!\n"); struct mylist *replace_node; replace_node= (struct mylist *)malloc(sizeof(struct mylist)); replace_node->num= 55; list_for_each(pos,&(head.list)) { iterate_pos = list_entry(pos,struct mylist,list); if(iterate_pos->num == 18) { list_replace((&iterate_pos->list),&(replace_node->list)); } } //使用list_for_each_entry 直接获取父结构指针并进行 遍历 printf("list use list_for_each_entry and check the replace inode\n"); struct mylist *entry_list; entry_list = (struct mylist *)malloc(sizeof(struct mylist)); list_for_each_entry(entry_list,&(head.list),list) printf("%d-",entry_list->num); printf("\n"); //delete list test struct list_head *freetmp,*p; struct mylist *freelist; list_for_each_safe(freetmp,p,&head.list) { freelist= list_entry(freetmp, struct mylist, list); printf("freeing item id= %d\n", freelist->num,freelist->name); list_del(freetmp); free(freelist); } if(list_empty(&head.list)) printf("list is empty now!\n"); return 0 ; }
相关文章推荐
- leetcode刷题6:对单链表重新排序--reorder list
- Leetcode Remove Linked List Elements 删除链表中的元素
- List.链表(增删改查)
- 动态链表练习(单线链表)
- [LeetCode] 234. Palindrome Linked List 回文链表
- 2008秋-计算机软件基础-单链表练习(1)
- [LeetCode] Remove Duplicates from Sorted List II 移除有序链表中的重复项之二
- leetcode 61. Rotate List 向右旋转k个元素 + 链表环遍历
- 获取windows进程信息及CListCtrl控件(List Control)练习
- [LeetCode] Plus One Linked List 链表加一运算
- java基础入门----LinkedList练习1
- Remove Nth Node From End of List(链表,带测试代码)
- 链表(Linked-list)
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- leetcode---partition-list---链表
- 数据结构与算法 LeetCode编程练习--Delete Node in a Linked List
- [leetcode 141] Linked List Cycle----判断链表是否为循环链表
- [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- Leetcode 19 Remove Nth Node From End of List 链表