1. 程式人生 > >佇列的鏈式建立和操作

佇列的鏈式建立和操作

之前完成了堆疊的建立和操作,現在開始實現佇列

佇列是:具有一定操作約束的線性表

其插入和刪除操作:只能在一端插入,而在另一端刪除

資料插入:入佇列

資料刪除:出佇列

先來先服務

先進先出:FIFO(First In First Out)

型別名稱:佇列(Queue)

資料物件集:一個有0個或者多個元素的有窮線性表

操作集,佇列Q∈Queue,元素item∈ElementType

1.Queue CreateQueue();生成空佇列

2.int IsFullQ(Queue Q);判斷佇列Q是否已滿

3.void AddQ(Queue Q,ElementType item);將元素item插入佇列Q中

4.int IsEmpty(Queue Q);判斷佇列Q是否為空

5.ElmentType DeleteQ(Queue Q);將隊頭元素從佇列中刪除並返回


注意佇列始終是從front一段刪除,並且從rear一段插入,因為如果從rear一段刪除會找不到其上一個節點

#include <stdio.h>    
#include <stdlib.h>

#define ERROR 0
    
struct Node{    
    int Data;    
    struct Node *Next;    
};    
    
struct QNode{    
    struct Node *rear;    
    struct Node *front;    
};
typedef struct QNode *Queue;  

//建立佇列
Queue CreateQueue();
//刪除佇列頭元素
int DeleteQ(Queue PtrQ); 
//在隊尾插入元素
void InsertQ(int item,Queue PtrQ);
//列印佇列
void Print(Queue PtrQ);
//判斷是否空  
int IsEmpty(Queue Q);
  
    
int main()    
{    
    Queue PtrQ=CreateQueue();
	Print(PtrQ);
    InsertQ(1,PtrQ);
    InsertQ(2,PtrQ);
	InsertQ(3,PtrQ);
    Print(PtrQ);
	DeleteQ(PtrQ);
	Print(PtrQ);
    InsertQ(1,PtrQ);
    Print(PtrQ);
	DeleteQ(PtrQ);
	DeleteQ(PtrQ);
	DeleteQ(PtrQ);
    Print(PtrQ);

    return 0;    
}    
 
Queue CreateQueue(){
	Queue PtrQ;  
    PtrQ=(Queue)malloc(sizeof(struct QNode));
	struct Node *rear;
	struct Node *front;
	rear =(Node*)malloc(sizeof(struct Node));
    rear=NULL;
    front =(Node*)malloc(sizeof(struct Node));
    front=NULL;
	PtrQ->front=front;
	PtrQ->rear=rear;
    return PtrQ;
};

int DeleteQ(Queue PtrQ){    
    struct Node *FrontCell;    
    int FrontElem;    
    
    if(IsEmpty(PtrQ)){    
        printf("佇列空");    
        return ERROR;    
    }  
    FrontCell=PtrQ->front;  
    if(PtrQ->front==PtrQ->rear)  
       PtrQ->front=PtrQ->rear=NULL;  
    else{  
        PtrQ->front=PtrQ->front->Next;  
    }  
      FrontElem=FrontCell->Data;  
      free(FrontCell);  
      return FrontElem;    
}    
  
void InsertQ(int item,Queue PtrQ){  
    struct Node *FrontCell;  
    FrontCell=(Node*)malloc(sizeof(struct Node));
	FrontCell->Data=item;
	FrontCell->Next=NULL;

	if(IsEmpty(PtrQ)){
		PtrQ->front=FrontCell;
		PtrQ->rear=FrontCell;
	}
	else{
		PtrQ->rear->Next=FrontCell;
		PtrQ->rear=FrontCell;
	}
};   
    
void Print(Queue PtrQ) {      
    struct Node *Q1;      
    Q1 = PtrQ->front;      
        if (Q1 == NULL) {      
            printf("NULL\n");      
            return;      
        }      
        while (Q1 != PtrQ->rear) {      
            printf("%d ", Q1->Data);  
			Q1 =Q1->Next;      
        }  
        printf("%d", Q1->Data);  
        putchar('\n');      
    }     

int IsEmpty(Queue Q){
	 return(Q->front==NULL);  
}; 
上面的程式碼已經把佇列的鏈式表示基本的函式全部包含在內了,下面是執行結果


佇列基本搞定,哦耶