[棧與佇列] 3.28 佇列 - 帶頭結點的迴圈鏈
阿新 • • 發佈:2018-11-12
題目來源:嚴蔚敏《資料結構》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;
}