1. 程式人生 > >C語言實現佇列的順序儲存

C語言實現佇列的順序儲存

佇列

 #1. 佇列不得和棧比較,棧是一種先進後出的線性表,而佇列是一種先進先出 (first in first out,縮寫 FIFO) 的線性表.
 #2. 它只允許在表的一端進行插入,而在另一端刪除元素。
 #3. 在佇列中插入的一端為隊尾(rear),允許刪除的一端為隊頭(front)。
 
 
這裡我們實現佇列的順序儲存,
實現ADT中基本操作
Status InitQueue(SqQueueP &SQ)
Status QueueEmpty(SqQueueP SQ)  Status EnQueue(SqQueueP &SQ,ElemType e)
ElemType DeQueue(SqQueueP &SQ)     Status QueueTraverse(SqQueueP SQ){
實現如下

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define Error 0
#define OVERFLOW -2
#define True 1
#define False 0
#define MAX_SIZE 15
typedef int Status; //函式執行結束狀態值
typedef struct{
    int x;
}Node;
typedef Node * ElemType;
typedef struct{
    ElemType elem[MAX_SIZE];
    int size;
}SqQueue,*SqQueueP;
Status InitQueue(SqQueueP &SQ){
    SQ = (SqQueue*)malloc(sizeof(SqQueue));
    SQ->size = 0;
    return OK;
}
Status QueueEmpty(SqQueueP SQ){
    if(SQ->size==0) return True;
    return False;
}
Status EnQueue(SqQueueP &SQ,ElemType e){
    SQ->elem[SQ->size] =e;
    SQ->size++;
    return OK;
}
ElemType DeQueue(SqQueueP &SQ){
	ElemType e;
	if(SQ->size > 0){
		e = SQ->elem[0];
		for(int i = 0; i < SQ->size-1; i++){
			SQ->elem[i] = SQ->elem[i+1];
		}
		SQ->size--;
	}
	return e;
}
Status QueueTraverse(SqQueueP SQ){
    for(int i = 0; i < SQ->size; i++){
        if(SQ->elem[i]) printf("%d",SQ->elem[i]->x);
        else printf("NULL");
    }
    return OK;
}
int main() {
    SqQueueP sq;
    InitQueue(sq);
    Node *pn1 = NULL;
    Node *pn2  = (Node *)malloc(sizeof(Node));
    pn2->x = 1;
    EnQueue(sq,pn1);
    EnQueue(sq,pn2);
    EnQueue(sq,pn1);
    EnQueue(sq,pn2);
    EnQueue(sq,pn1);
    EnQueue(sq,pn2);
    while(!QueueEmpty(sq)){
        Node *temppn = DeQueue(sq);
        if(temppn) printf(" %d ",temppn->x);
        else printf("NULL");
    }
    
    free(pn2);
    return 0;
}