C語言-資料結構-鏈佇列
阿新 • • 發佈:2018-12-10
**
鏈式佇列
**
使用兩種不同的方式作為初始化, 特點: 一種是傳遞 Init(&Q); 一種是直接P Q = create(); 我覺得還是這種的方式比較靈活,對比見程式
注:我的習慣是直接寫成標頭檔案,方便呼叫
這個程式使用的 是InitQueue(PQueue Q) #ifndef _QUEUECHAIN #define _QUEUECHAIN //宣告標頭檔案 #include “stdio.h” #include “malloc.h” #include “stdbool.h” #include “stdlib.h”
/* 宣告結構體 */ typedef struct Node{ int data; struct Node *next; }Node,*PNode; typedef struct Stack{ PNode front, rear; //指向Node的front和rear }Queue,*PQueue; //佇列 //建立建立佇列 Q->front = Q->rear; next = NULL; //判斷佇列為空 Q->front = Q->rear; //入隊 新建結點,插入到鏈尾,尾指標指向該結點 Node給rear //出隊 判斷隊空; 直接出隊,釋放 輸出front->next void InitQueue(PQueue Q) //這裡傳的是指標 { Q->front = Q->rear = (PNode)malloc(sizeof(Node)); Q->front->next = NULL; return; } bool IsEmpty(PQueue Q) { // printf("dsg\n"); if(Q->front == Q->rear) { return true; } return false; } void QueuePosh(PQueue Q, int val) { PNode N = (PNode)malloc(sizeof(Node)); //create temp node N->data = val; N->next = NULL; Q->rear->next = N; //rear to next Q->rear = N; //rear->N // printf("%d\n",Q->front->next->data); // printf("%d\n",Q->rear->data); return; } void QueuePop(PQueue Q,int *val) { if(IsEmpty(Q)) { printf("Queue is Empty!\n");return; } PNode N = Q->front->next; *val = N->data; Q->front->next = N->next; if(Q->rear == N) Q->rear = Q->front; //原佇列只有一個結點,刪除後為空 free(N); return; } //標頭檔案 //void main() //{ // Queue Q; // int val; // InitQueue(&Q); //這裡傳的是指標 // QueuePop(&Q,&val); // QueuePosh(&Q,23); // // QueuePop(&Q,&val); // QueuePop(&Q,&val); // // QueuePosh(&Q,34); // QueuePosh(&Q,4); // QueuePosh(&Q,56); // QueuePosh(&Q,33); // QueuePop(&Q,&val); // printf("pop%d\n",val); // QueuePop(&Q,&val); // printf("pop%d\n",val); // printf("\n\nhello world;!\n\n"); // return; //} #endif
下面這個是更新的 Create直接返回指著地址
#ifndef __QUEUECHAINCREAT_ #define __QUEUECHAINCREAT_ //宣告標頭檔案 #include "stdio.h" #include "malloc.h" #include "stdbool.h" #include "stdlib.h" /* 宣告結構體 */ typedef struct Node{ int data; struct Node *next; }Node,*PNode; typedef struct Stack{ PNode front, rear; //指向Node的front和rear }Queue,*PQueue; //佇列 //建立建立佇列 Q->front = Q->rear; next = NULL; //判斷佇列為空 Q->front = Q->rear; //入隊 新建結點,插入到鏈尾,尾指標指向該結點 Node給rear //出隊 判斷隊空; 直接出隊,釋放 輸出front->next //這種初始化比較方便,在後面的程式中就可以直接使用Q指標,而不需要在使用&Q來改變Q裡面的資料 PQueue CreatQueue() { PQueue Q = (PQueue)malloc(sizeof(Queue)); //開闢PQueue指標的空間 Q->front = Q->rear = (PNode)malloc(sizeof(Node)); //開闢結點的空間,此時front和rear都指向一個位置 Q->front->next = NULL; return Q; } bool IsEmpty(PQueue Q) { if(Q->front == Q->rear) { return true; } return false; } void QueuePosh(PQueue Q, int val) { PNode N = (PNode)malloc(sizeof(Node)); //create temp node N->data = val; N->next = NULL; Q->rear->next = N; //rear to next Q->rear = N; //rear->N return; } void QueuePop(PQueue Q, int *val) { if(IsEmpty(Q)) { printf("Queue is Empty!\n");return; } PNode N = Q->front->next; *val = N->data; Q->front->next = N->next; if(Q->rear == N) Q->rear = Q->front; //原佇列只有一個結點,刪除後為空 free(N); return; } //void main() //{ // PQueue Q = CreatQueue(); // int val; // // QueuePop(Q,&val); // QueuePosh(Q,23); // // QueuePop(Q,&val); // QueuePop(Q,&val); // // QueuePosh(Q,34); // QueuePosh(Q,4); // QueuePosh(Q,56); // QueuePosh(Q,33); // QueuePop(Q,&val); // printf("pop%d\n",val); // QueuePop(Q,&val); // printf("pop%d\n",val); //} #endif