/* c3-2.h 單鏈隊列--隊列的鏈式存儲結構 */ typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front,rear; /* 隊頭、隊尾指針 */ }LinkQueue;
/* bo3-2.c 鏈隊列(存儲結構由c3-2.h定義)的基本操作(9個) */ Status InitQueue(LinkQueue *Q) { /* 構造一個空隊列Q */ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front) exit(OVERFLOW); (*Q).front->next=NULL; return OK; } Status DestroyQueue(LinkQueue *Q) { /* 銷燬隊列Q(無論空否均可) */ while((*Q).front) { (*Q).rear=(*Q).front->next; free((*Q).front); (*Q).front=(*Q).rear; } return OK; } Status ClearQueue(LinkQueue *Q) { /* 將Q清爲空隊列 */ QueuePtr p,q; (*Q).rear=(*Q).front; p=(*Q).front->next; (*Q).front->next=NULL; while(p) { q=p; p=p->next; free(q); } return OK; } Status QueueEmpty(LinkQueue Q) { /* 若Q爲空隊列,則返回TRUE,否則返回FALSE */ if(Q.front==Q.rear) return TRUE; else return FALSE; } int QueueLength(LinkQueue Q) { /* 求隊列的長度 */ int i=0; QueuePtr p; p=Q.front; while(Q.rear!=p) { i++; p=p->next; } return i; } Status GetHead_Q(LinkQueue Q,QElemType *e) /* 避免與bo2-6.c重名 */ { /* 若隊列不空,則用e返回Q的隊頭元素,並返回OK,否則返回ERROR */ QueuePtr p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; *e=p->data; return OK; } Status EnQueue(LinkQueue *Q,QElemType e) { /* 插入元素e爲Q的新的隊尾元素 */ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) /* 存儲分配失敗 */ exit(OVERFLOW); p->data=e; p->next=NULL; (*Q).rear->next=p; (*Q).rear=p; return OK; } Status DeQueue(LinkQueue *Q,QElemType *e) { /* 若隊列不空,刪除Q的隊頭元素,用e返回其值,並返回OK,否則返回ERROR */ QueuePtr p; if((*Q).front==(*Q).rear) return ERROR; p=(*Q).front->next; *e=p->data; (*Q).front->next=p->next; if((*Q).rear==p) (*Q).rear=(*Q).front; free(p); return OK; } Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType)) { /* 從隊頭到隊尾依次對隊列Q中每個元素調用函數vi()。一旦vi失敗,則操作失敗 */ QueuePtr p; p=Q.front->next; while(p) { vi(p->data); p=p->next; } printf("\n"); return OK; }
/* main3-2.c 檢驗bo3-2.c的主程序 */ #include"c1.h" typedef int QElemType; #include"c3-2.h" #include"bo3-2.c" void visit(QElemType i) { printf("%d ",i); } int main() { int i; QElemType d; LinkQueue q; i=InitQueue(&q); if(i) printf("成功地構造了一個空隊列!\n"); printf("是否空隊列?%d(1:空 0:否) ",QueueEmpty(q)); printf("隊列的長度爲%d\n",QueueLength(q)); EnQueue(&q,-5); EnQueue(&q,5); EnQueue(&q,10); printf("插入3個元素(-5,5,10)後,隊列的長度爲%d\n",QueueLength(q)); printf("是否空隊列?%d(1:空 0:否) ",QueueEmpty(q)); printf("隊列的元素依次爲:"); QueueTraverse(q,visit); i=GetHead_Q(q,&d); if(i==OK) printf("隊頭元素是:%d\n",d); DeQueue(&q,&d); printf("刪除了隊頭元素%d\n",d); i=GetHead_Q(q,&d); if(i==OK) printf("新的隊頭元素是:%d\n",d); ClearQueue(&q); printf("清空隊列後,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next); DestroyQueue(&q); printf("銷燬隊列後,q.front=%u q.rear=%u\n",q.front, q.rear); return 0; }