1. 程式人生 > >[棧與佇列] 3.28 佇列 - 帶頭結點的迴圈鏈

[棧與佇列] 3.28 佇列 - 帶頭結點的迴圈鏈

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 3.28

#include<stdio.h>
#include<stdlib.h>

#ifndef BASE
#define BASE
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int bool;
#endif

// 實現:佇列
// 資料結構:迴圈連結串列(帶頭結點)
// 結構體:只設置一個指標指向隊尾元素結點(不設頭指標)
typedef int ElemType; typedef struct NodeType{ ElemType data; struct NodeType *next; }QNode, *QPtr; typedef struct{ QPtr rear; }Queue; Status InitQueue(Queue *pQ) { QNode *newNode; //頭結點 newNode = (QNode *)malloc(sizeof(QNode)); if (!newNode) exit(OVERFLOW); newNode->next = newNode; //指向自己,迴圈連結串列
pQ->rear = newNode; //尾指標指向頭結點 return OK; } Status EnQueue(Queue *pQ, ElemType e) { QNode *newNode; newNode = (QNode *)malloc(sizeof(QNode)); if (!newNode) exit(OVERFLOW); newNode->data = e; newNode->next = pQ->rear->next; pQ->rear->next = newNode; pQ->rear = newNode;
return OK; } Status DeQueue(Queue *pQ,ElemType *e) { QNode *tmp, *top; if (pQ->rear->next==pQ->rear) return ERROR; //空 top = pQ->rear->next; //頭結點 tmp = top->next; //得到佇列的第一個元素 *e = tmp->data; //賦值 //刪除佇列的第一個元素 top->next = tmp->next; free(tmp); //如果佇列又為空,則需要改變尾指標的指向 if (top->next==top) pQ->rear=top; return OK; } Status Debug(Queue Q, void (*Visit)(ElemType e)) { QNode *top,*tmp; printf("----------------\n"); printf("rear指向:%d\n", Q.rear->data); //debug top = Q.rear->next; tmp = top; do { Visit(tmp->data); tmp=tmp->next; }while(tmp!=top); printf("\n----------------\n"); return OK; } void visit(ElemType e) { printf("%d\t", e); } int main() { int c; int tmp; Queue Q; InitQueue(&Q); Debug(Q, &visit); while (1) { scanf("%d", &c); switch(c) { case 1:scanf("%d",&tmp);EnQueue(&Q, tmp);Debug(Q,&visit);break; case 2:DeQueue(&Q, &tmp);printf("丟擲%d\n", tmp);Debug(Q,&visit);break; } } return 0; }