看完内核中的链表操作部分,写了个通用队列
2014-10-24 23:56
309 查看
通用队列
/* *filename:queue.c tongyong_queue *time: 2014-10-24 * */ #include <stdio.h> #include <stdlib.h> #define list_entry(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) /* *宏里面的参数说明 *ptr 是一个指向Linklist通用链的指针 *type 是一个包含Linklist的自定义的结构的类型 *member 是自定的结构中类型为Linklist的域 */ //定义通用链的数据结构 typedef struct node { struct node *next; }Linklist; //定义队列的数据结构 typedef struct Qnode { Linklist *front; Linklist *rear; }Queue; //定义自己的节点,包含Linklist typedef struct mynode { int data; Linklist List; }Mynode; //函数声明 void initial_queue(Queue *q); void inQueue(Queue *q, Linklist *p); Linklist *outQueue(Queue *q); int isEmpty(Queue *q); //队列初始化 void initial_queue(Queue *q) { q->front = q->rear = NULL; } //入队操作 void inQueue(Queue *q, Linklist *p) { if(q->front == NULL) { q->front = q->rear = p; } else { q->rear->next = p; //尾插法 q->rear = p; } } //出队操作 Linklist *outQueue(Queue *q) { Linklist *t = NULL; if(q->front == NULL ) { return NULL; } t = q->front; q->front = t->next; //相当于删除了一个结点 if(q->front == NULL) //若当前结点是最后一个结点 { q->rear = NULL; } return t; } int isEmpty(Queue *q) { if(q->front == NULL) return 1; else return 0; } int main() { Queue q; Mynode node1, node2, node3, *h; Linklist *hh; initial_queue(&q); printf("inQueue: "); node1.data = 1; inQueue(&q, &(node1.List)); printf("%d ", node1.data); node2.data = 2; inQueue(&q, &(node2.List)); printf("%d ", node2.data); node3.data = 3; inQueue(&q, &(node3.List)); printf("%d ", node3.data); printf("\noutQueue: "); hh = outQueue(&q); h = list_entry(hh, Mynode, List); printf("%d ", h->data); hh = outQueue(&q); h = list_entry(hh, Mynode, List); printf("%d ", h->data); hh = outQueue(&q); h = list_entry(hh, Mynode, List); printf("%d\n", h->data); return 0; }
相关文章推荐
- 数据结构类型定义及基本操作汇总(一)--线性表,单链表,栈和队列
- 链表队列与二叉树基本操作
- 数据结构_队列_用链表动态建立释放节点实现队列各种操作_C++实现
- 链表,栈,队列插入删除操作
- linux 内核的链表操作(好文不得不转)
- (原创)Linux内核网络设备操作部分阅读笔记
- linux 内核的链表操作
- Linux 内核中工作队列的操作
- 通用链表(内核双向循环链表list_head)
- 双端队列部分操作(剩下部分待补)
- 构建基于通用导航器架构(CNF)的视图 第四部分:基于对象的操作(Object Contributions)
- (转载)Linux内核网络设备操作部分阅读笔记收藏
- bo2-9.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(2个)
- 内核 API,第 2 部分:可延迟函数、内核微线程以及工作队列
- linux 内核的链表操作(好文不得不转)
- 链表与队列的公共操作
- bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)
- 修改自linux内核的双向循环链表通用算法
- 内核 API,第 2 部分:可延迟函数、内核微线程以及工作队列
- 内核 API,第 2 部分:可延迟函数、内核微线程以及工作队列