資料結構-順序佇列(C語言)
阿新 • • 發佈:2019-01-02
佇列:插入資料只在隊尾進行,刪除資料只在隊頭進行。
順序佇列操作會出現 假溢位(tail指向佇列最後,進行入隊操作時,即使前面有空位置也顯示佇列已滿)
解決:
1.在出隊操作後,增加移動元素操作。每次進行完出隊操作後,佇列中後面的元素向前移動,始終保持佇列第一個位置有元素。(每次移動大量元素,效率低)
2.佇列首位相連--迴圈佇列
SeqQueue.h
#define QUEUEMAX 15 typedef struct { DATA data[QUEUEMAX];//佇列陣列 int head;//隊頭 int tail;//隊尾 }SeqQueue; SeqQueue *SeqQueueInit()//初始化佇列 { SeqQueue *q; if(q=(SeqQueue *)malloc(sizeof(SeqQueue))) { q->head=0; q->tail=0; return q; } else return NULL; } void SeqQueueFree(SeqQueue *q)//釋放佇列 { if(q!=NULL) free(q); } int SeqQueueIsEmpty(SeqQueue *q)//佇列是否為空,空為0 { return (q->head==q->tail); } int SeqQueueIsFull(SeqQueue *q)//佇列是否為已滿,滿為1 { return (q->tail==QUEUEMAX); } int SeqQueueLen(SeqQueue *q)//返回佇列長度 { return (q->tail-q->head); } int SeqQueueIn(SeqQueue *q,DATA data)//入隊 { if(q->tail==QUEUEMAX){//判斷佇列q是否已滿,滿返回0 printf("Queue is full!\n"); return 0; } else{ q->data[q->tail++]=data; return 1; } } DATA *SeqQueueOut(SeqQueue *q)//出隊 { if(SeqQueueIsEmpty(q)) { printf("Queue is empty!\n");//判斷佇列是否為空,空返回NULL return NULL; } else{ return &(q->data[q->head++]); } } DATA *SeqQueuePeek(SeqQueue *q)//獲取隊頭元素 { if(SeqQueueIsEmpty(q)) { printf("Queue is empty!\n"); return NULL; } else{ return &(q->data[q->head]); } }
SeqQueueTest.c
#include<stdio.h> #include<stdlib.h> typedef struct{ char key[15]; char name[15]; }DATA; #include"SeqQueue.h" int main() { DATA *data1,data; SeqQueue *q; q=SeqQueueInit(); printf("input key name:");//一次入隊 scanf("%s%s",&data.key,&data.name); SeqQueueIn(q,data); data1=SeqQueueOut(q);//一次出隊 printf("(%s,%s)",data1->key,data1->name); SeqQueueFree(q); getch(); return 0; }