42深入理解C指针之---指针与队列
一、借助第40指针与链表的相关内容,稍微修改即可:
1、定义头文件queue.h代码如下:
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 #ifndef queue_h 5 #define queue_h 6 typedef int DataType; 7 8 typedef struct _node{ 9 DataType data; 10 struct _node *next; 11 } Node; 12 13 typedef struct _queue{ 14 Node *head; 15 Node *tail; 16 } Queue; 17 18 void initQueue(Queue *); 19 void enQueue(Queue *, DataType); 20 void deQueue(Queue *); 21 int getLength(Queue *); 22 void dispQueue(Queue *); 23 24 #endif
头文件中依旧是完成数据类型的声明和数据的操作函数的声明。
2、头文件对应的实现文件queue.c代码如下:
1 #include "queue.h" 2 3 //队列初始化 4 void initQueue(Queue *queue){ 5 queue->head = NULL; 6 queue->tail = NULL; 7 } 8 9 //队列入 10 void enQueue(Queue *queue, DataType iData){ 11 Node *node = (Node *)malloc(sizeof(Node)); 12 node->data = iData; 13 node->next = NULL; 14 15 if(queue->head == NULL){ 16 queue->head = node; 17 }else{ 18 queue->tail->next = node; 19 } 20 queue->tail = node; 21 22 return; 23 24 } 25 26 //队列出 27 void deQueue(Queue *queue){ 28 if(queue->head->next == NULL){ 29 queue->head = NULL;; 30 }else{ 31 queue->head = queue->head->next; 32 } 33 34 return; 35 } 36 37 //队列长度 38 int getLength(Queue *queue){ 39 Node *node = queue->head; 40 int i = 0; 41 while(node != NULL){ 42 node = node->next; 43 i++; 44 } 45 46 return i; 47 } 48 49 //队列输出 50 void dispQueue(Queue *queue){ 51 Node *node = queue->head; 52 int i = 0; 53 while(node != NULL){ 54 printf("the %dth node: %d\n", i + 1, node->data); 55 node = node->next; 56 i++; 57 } 58 printf("disp finished!\n"); 59 60 return; 61 }
代码说明:
1、入队函数使用链表的尾插法
2、出队函数直接将链表的头节点删除即可实现出队功能
3、queue.c对应的测试文件testQueue.c代码如下:
1 #include "queue.h" 2 3 int main(int argc, char **argv) 4 { 5 Queue *queue1 = (Queue *)malloc(sizeof(Queue)); 6 printf("the first:\n"); 7 initQueue(queue1); 8 enQueue(queue1, 1); 9 enQueue(queue1, 3); 10 enQueue(queue1, 5); 11 enQueue(queue1, 7); 12 enQueue(queue1, 9); 13 printf("The length: %d\n", getLength(queue1)); 14 dispQueue(queue1); 15 printf("the second:\n"); 16 deQueue(queue1); 17 printf("The length: %d\n", getLength(queue1)); 18 dispQueue(queue1); 19 deQueue(queue1); 20 dispQueue(queue1); 21 printf("The length: %d\n", getLength(queue1)); 22 enQueue(queue1, 11); 23 dispQueue(queue1); 24 printf("The length: %d\n", getLength(queue1)); 25 26 return 0; 27 }
测试函数完成所有函数的功能测试,功能通过就OK!
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。