队列
马上要准备复试了,没事看看数据结构和算法。正好Dream-here哥们需要学c语言了,我开始写点东西,也希望我这样的低手也能对像他一样的初学小白有所帮助。前几天自己没事实现一个huffman编码和解码,其中需要统计词频高低,我当时是做了一个有序链表插入排序,其实stl中现成的priority_queue就可以完成而且效率很高,可以参考侯捷的《stl源码剖析》。昨天复习了一下图的深度和广度优先遍历,广度遍历中又需要一个队列(循环队列更好),当时是手工实现了一个最简单的。既然是入门篇,我就先从挥之不去的队列说起。
队列是什么?
说简单一点其实就是一堆数据,数据放在一起穿成一个线性的逻辑造型(注意这里指逻辑上是这样组织的就可以),我们都称为“线性表”。我们要说的就是一个线性表,为什么要给它取个名字叫队列呢?主要是因为我们对这个线性表中的数据的操作有规定,即“先进先出”,对数据的操作遵从“先来后到”,这不就是一个数据永远先后有序操作的理想世界了嘛,名字非常形象。
我这里就写一个队列示例
1 #include <malloc.h> 2 #include <assert.h> 3 4 #define NULL 0 5 6 typedef struct Node 7 { 8 int data; 9 struct Node *next; 10 }queue, *queuePtr; 11 12 typedef struct 13 { 14 queuePtr front; //对头指针 15 queuePtr rear; //队尾指针 16 }linkQueue; 17 18 bool initQueue(linkQueue *Q) 19 { 20 Q->front = Q->rear = (queuePtr)malloc(sizeof(queue)); 21 if(Q->front==NULL) 22 return false; 23 Q->front->next = NULL; 24 return true; 25 } 26 27 void destroyQueue(linkQueue *Q) //单链表结构释放指针不需要rear属性 28 { 29 assert(Q!=NULL); 30 while(Q->front) 31 { 32 Q->rear = Q->front->next; 33 free(Q->front); 34 Q->front = Q->rear; 35 } 36 } 37 38 bool queueEmpty(linkQueue *Q) 39 { 40 assert(Q->front!=NULL&&Q->rear!=NULL); 41 if(Q->front==Q->rear) 42 return true; 43 else 44 return false; 45 } 46 47 int queueLength(linkQueue *Q) 48 { 49 assert(Q->front!=NULL); 50 queuePtr p = Q->front; 51 int length = 0; 52 while(p!=Q->rear) 53 { 54 length++; 55 p = p->next; 56 } 57 return length; 58 } 59 60 bool getHead(linkQueue *Q, int *e) 61 { 62 assert(Q->front!=NULL); 63 if(queueEmpty(Q)) 64 return false; 65 else 66 { 67 *e = Q->front->next->data; 68 return true; 69 } 70 } 71 72 void queueTraverse(linkQueue *Q, void (*visit)(int)) 73 { 74 assert(Q->front!=NULL); 75 queuePtr p = Q->front->next; 76 while(p) 77 { 78 (*visit)(p->data); 79 p = p->next; 80 } 81 } 82 83 bool enQueue(linkQueue *Q, int e) 84 { 85 queuePtr tmp = (queuePtr)malloc(sizeof(Node)); 86 if(!tmp) 87 return false; 88 tmp->data = e; 89 tmp->next = NULL; 90 Q->rear->next = tmp; 91 Q->rear = tmp; 92 return true; 93 } 94 95 bool deQueue(linkQueue *Q, int *e) 96 { 97 if(Q->front==Q->rear) 98 return false; 99 queuePtr tmp = Q->front->next; 100 *e = tmp->data; 101 Q->front->next = tmp->next; 102 if(Q->rear==tmp) 103 Q->rear = Q->front; 104 free(tmp); 105 return true; 106 }