佇列的鏈式儲存的兩種定義方式
阿新 • • 發佈:2018-12-29
佇列的鏈式儲存的定義結點、初始化、判斷空、入隊、出隊、讀取隊頭元素、求佇列長度操作
方法一:
這種鏈佇列有頭指標,上圖分別為鏈佇列為空、非空、只有一個元素的時候的情況,
程式碼如下:
//佇列的鏈式儲存和操作的實現 #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int DataType; typedef struct Node{ //定義鏈隊結點的型別 DataType data; struct Node *next; }LinkNode; typedef struct{ //將頭尾指標封裝在一起的鏈佇列 LinkNode *front,*rear; }LinkQueue; void Init_Queue(LinkQueue *&q) //佇列初始化,使front和rear都指向頭佇列的頭結點 { q=(LinkQueue*)malloc(sizeof(LinkQueue)); LinkNode *p; p=(LinkNode*)malloc(sizeof(LinkNode)); p->next=NULL; q->front=q->rear=p; } int Queue_Empty(LinkQueue *q) //判斷空操作 { if(q->front==q->rear) return 1; else return 0; } void Push_Queue(LinkQueue *q,DataType x) //入佇列操作 { LinkNode *p; p=(LinkNode*)malloc(sizeof(LinkNode)); p->data=x; p->next=NULL; q->rear->next=p; q->rear=p; } void GetHead_Queue(LinkQueue *q) //讀取隊頭元素 { LinkNode *p; if(Queue_Empty(q)) printf("Queue is Empty\n"); else { p=q->front->next; DataType x=p->data; printf("%d\n",x); } } void Pop_Queue(LinkQueue *q) //出隊操作 { LinkNode *p; if(Queue_Empty(q)) printf("Queue is Empty\n"); else { p=q->front->next; q->front->next=p->next; if(p->next==NULL) q->rear=q->front; free(p); } } void Queue_Length(LinkQueue *q) //求佇列的長度 { int t=0; LinkNode *p; p=q->front->next; while(p!=NULL) { t++; p=p->next; } printf("Queue Length is %d\n",t); } int main() { LinkQueue *q; Init_Queue(q); Push_Queue(q,1); Push_Queue(q,2); Push_Queue(q,3); Queue_Length(q); GetHead_Queue(q); Pop_Queue(q); Queue_Length(q); GetHead_Queue(q); }
方法二:
這種鏈佇列無頭結點,上圖分別為鏈佇列為空,元素進隊的情況
程式碼如下:
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int DataType; typedef struct Node{ //定義鏈隊結點的型別 DataType data; struct Node *next; }LinkNode; typedef struct{ //將頭尾指標封裝在一起的鏈佇列 LinkNode *front,*rear; }LinkQueue; void Init_Queue(LinkQueue *&q) //佇列初始化 { q=(LinkQueue*)malloc(sizeof(LinkQueue)); q->front=NULL; q->rear=NULL; } void Push_Queue(LinkQueue *q,DataType x) //入隊操作 { LinkNode *p; p=(LinkNode*)malloc(sizeof(LinkNode)); p->data=x; p->next=NULL; if(q->front==NULL) { q->front=p; q->rear=p; } else { q->rear->next=p; q->rear=p; } } int Queue_Empty(LinkQueue *q) //判斷空操作 { if(q->front==NULL) return 1; else return 0; } void Pop_Queue(LinkQueue *q) //出隊操作 { LinkNode *p; if(Queue_Empty(q)) printf("Queue is Empty"); else { p=q->front; q->front=p->next; if(q->front==NULL) q->rear=NULL; free(p); } } void GetHead_Queue(LinkQueue *q) //讀取隊頭元素 { if(Queue_Empty(q)) printf("Queue is Empty!\n"); else printf("%d\n",q->front->data); } void Queue_Length(LinkQueue *q) //求佇列的長度 { LinkNode *p; p=q->front; int t=0; while(p!=NULL) { t++; p=p->next; } printf("Queue Length is %d\n",t); } int main() { LinkQueue *q; Init_Queue(q); Push_Queue(q,1); Push_Queue(q,2); Push_Queue(q,3); Queue_Length(q); GetHead_Queue(q); Pop_Queue(q); Queue_Length(q); GetHead_Queue(q); }