数据结构与算法分析——c语言描述 第三章 队列的链表实现
虽然是用链表实现,但队列头文件可不能有链表的函数,封装隐藏起来,所以在.c文件里,函数前面加了一个static,相当于c++的private下的函数。用脑想一想拆分功能,模块化。
2016.3.25更新,以前的版本是rear在最全,front在最后。上课听了老师讲后,改成front在前,rear在后,省去了遍历,复杂度为O(1)。
queue_cursor.h
typedef int ElementType; #ifndef _queue_cursor_h #define _queue_cursor_h struct QueueRecord; typedef struct QueueRecord *Queue; struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; int IsEmpty(Queue Q); Queue CreateQueue(); void DisposeQueue(Queue Q); void MakeEmpty(Queue Q); void Enqueue(ElementType X, Queue Q); ElementType Front(Queue Q); void Dequeue(Queue Q); ElementType FrontAndDequeue(Queue Q); #endif
#include "queue_cursor.h" #include "fatal.h" #include <stdlib.h> struct QueueRecord { List L; PtrToNode Rear; int Size; }; struct Node { ElementType Element; Position Next; }; static void DeleteList(List L) { Position p; p = L->Next; L->Next = NULL; while (p != NULL) { Position tmp; tmp = p->Next; free(p); p = tmp; } } static void DisposeList(List L) { DeleteList(L); free(L); } static void Insert(ElementType X, Queue Q, Position P) { Position tmpCell; tmpCell = malloc(sizeof(struct Node)); if (tmpCell == NULL) FatalError("Out of space!!"); tmpCell->Element = X; if (P->Next == NULL) Q->Rear = tmpCell; tmpCell->Next = P->Next; P->Next = tmpCell; } static List creatList() { List L = malloc(sizeof(struct Node)); if (L == NULL) Error("out of memory"); L->Next = NULL; return L; } int IsEmpty(Queue Q) { return Q->Size == 0; } Queue CreateQueue() { Queue q; q = malloc(sizeof(struct QueueRecord)); if (q == NULL) Error("out of memory"); q->L = creatList(); q->Rear = q->L; q->Size = 0; return q; } void DisposeQueue(Queue Q) { if (Q != NULL) { DisposeList(Q->L); free(Q); } } void MakeEmpty(Queue Q) { DeleteList(Q->L); Q->Rear = Q->L; Q->Size = 0; } void Enqueue(ElementType X, Queue Q) { Insert(X, Q, Q->Rear); Q->Size++; } ElementType Front(Queue Q) { if (IsEmpty(Q)) Error("Empty queue"); return Q->L->Next->Element; } void Dequeue(Queue Q) { if (IsEmpty(Q)) Error("Empty queue"); Position temp = Q->L->Next->Next; free(Q->L->Next); Q->L->Next = temp; Q->Size--; } ElementType FrontAndDequeue(Queue Q) { ElementType X = Front(Q); Dequeue(Q); return X; }
main.c
#include<stdlib.h> #include<stdio.h> #include"queue_cursor.h" int main() { Queue q = CreateQueue(); for (int i = 0; i < 8; i++){ Enqueue(i, q); } printf("%d\n", FrontAndDequeue(q)); printf("%d\n", FrontAndDequeue(q)); printf("%d\n", FrontAndDequeue(q)); }