队列这个十分容易理解,其实对于队列来说,就好比我们去超市排队买菜,在收款的时候每个人一依次排成一队,中间是不允许人来插队的。并且对于队首和队尾的位置会专门有一个存储空间去记录它,这样使它更加的科学,更加符合数据结构带给我们方便性的原理。与此同时,队列其实就是特殊的线性表,对于其特殊性,我就不言而喻了。对于我们去操作使用队列的时候,前后尾部记录对我们来说尤其有用,帮助我们去优化实现数据的存储、输出等一系列操作。
而循环队列其实也是为我们提供了一个思路----节省内存空间。虽然我们现在的代码只不过是占用了内存空间的九牛一毛,但是对于我们以后去做大项目的时候是特别有用的。它就像一个圆圈一样,存到队尾,如果存满后,有人要出去,那么就会腾出一部分空间,一般来说,这部分空间我们是无法在利用的,并且利用起来特别的麻烦,但是数据结构给我们了一个思路,让我们可以更好的利用空间去操作,所以这便是其奇妙之处。
链队列#include循环队列#include typedef struct LinkNode{ int data; LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue)); //The header, the data is not useful. LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNodePtr)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; }//Of initQueue void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; }//Of while printf("rn"); }//Of outputLinkQueue void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //Step 1. Create a new node LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; //Step 2. Link to the existing rear paraQueuePtr->rear->next = tempNodePtr; //Step 3. It is the new rear paraQueuePtr->rear = tempNodePtr; }//Of enqueue int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //Step 1. Is the queue empty? if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); return -1; }//Of if //Step 2. Change the queue. tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; }//Of if //Step 3. Free space. // free(tempNodePtr); tempNodePtr = NULL; //Step 4. Return. return resultValue; }//Of enqueue void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); }//Of testLinkQueue int main(){ testLinkQueue(); return 1; }//Of main
#include#include #define TOTAL_SPACE 5 typedef struct CircleIntQueue{ int data[TOTAL_SPACE]; int head; int tail; }*CircleIntQueuePtr; CircleIntQueuePtr initQueue() { CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue)); resultPtr->head = 0; resultPtr->tail = 0; return resultPtr; }// Of the first constructor void enqueue(CircleIntQueuePtr paraPtr, int paraValue) { if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) { printf("Queue full.rn"); return; } // Of if paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue; paraPtr->tail++; }// Of enqueue int dequeue(CircleIntQueuePtr paraPtr) { int resultValue; if (paraPtr->head == paraPtr->tail) { printf("No element in the queue.rn"); return -1; } // Of if resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE]; paraPtr->head++; return resultValue; }// Of dequeue void outputLinkQueue(CircleIntQueuePtr paraPtr){ int i; if (paraPtr->head == paraPtr->tail) { printf("Empty queue."); return; } // Of if printf("Elements in the queue: "); for (i = paraPtr->head; i < paraPtr->tail; i++) { printf("%d, ", paraPtr->data[i % TOTAL_SPACE]); } // Of for i printf("rn"); }//Of outputLinkQueue void testLinkQueue() { int i = 10; CircleIntQueuePtr tempPtr = initQueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); }//Of for i outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("dequeue gets %drn", dequeue(tempPtr)); }//Of for i enqueue(tempPtr, 8); outputLinkQueue(tempPtr); }//Of testLinkQueue int main() { testLinkQueue(); return 1; }//Of main



