/* linkedQueue.c */ /* 鏈隊列 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> /* 鏈隊列數據結構 */ typedef struct node { int data; /* 節點存儲數據 */ struct node *next; /* 指向下一個節點的指針 */ } Node; /* front指向隊列頭,rear指向隊列尾 */ /* front->next指向隊列第一個節點 */ typedef struct { Node *front, *rear; } Queue; void interface(void); /* 鏈隊列函數聲明 */ Queue *initializeQueue(); bool isEmptyQueue(Queue *q); void inQueue(Queue *q, int number); int outQueue(Queue *q); int main(){ Queue *q = initializeQueue(); int flag, number; interface(); for(;;){ printf("Command: "); scanf("%d", &flag); switch(flag){ case 0: puts("Bye!"); return 0; break; case 1: printf("Enter a number: "); scanf("%d", &number); inQueue(q, number); break; case 2: if(isEmptyQueue(q)) printf("Queue is empty!\n"); else printf("value: %d\n", outQueue(q)); break; } } return 0; } void interface(void){ puts("+************************+"); puts("+ 0, quit 退出 +"); puts("+ 1, in 入隊 +"); puts("+ 2, out 出隊 +"); puts("+************************+"); } /* 鏈隊列函數實現 */ /* 初始化鏈隊列 */ Queue *initializeQueue(){ /* 申請Queue結構體以及Node頭節點,front和rear均指向頭節點 */ Queue *q = (Queue*)malloc(sizeof(Queue)); Node *p = (Node*)malloc(sizeof(Node)); p->next = NULL; q->front = p; q->rear = p; return q; } /* 判斷隊列是否為空 */ bool isEmptyQueue(Queue *q){ if(q->front==q->rear) return true; else return false; } /* 入列 */ void inQueue(Queue *q, int number){ /* 新建一個節點,存儲number數據,rear指向新節點 */ Node *p = (Node*)malloc(sizeof(Node)); p->data = number; p->next = NULL; q->rear->next = p; /* 隊列中的最后一個節點的next指向這個新的節點 */ q->rear = p; /* rear指向新節點 */ } /* 出列 */ int outQueue(Queue *q){ Node *p = q->front->next; /* p指向隊列的第一個節點 */ q->front->next = p->next; /* q->front->next指向第二個節點 */ int r = p->data; /* 獲取第一個節點存儲的值 */ free(p); /* 釋放第一個節點 */ /* 只有一個元素時,出隊后隊空,需要修改尾指針 */ if(q->front->next==NULL) q->rear = q->front; return r; }