1. 程式人生 > >資料結構-鏈佇列

資料結構-鏈佇列

佇列類似線性表和棧,也是定義線上性結構上的ADT,與線性表和棧的區別在於,元素的插入和刪除分別在表的兩端進行,類似生活中的排隊,允許插入的一端為隊尾,允許刪除端稱隊頭。

用連結串列表示的佇列稱為鏈佇列。一個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標才能唯一確定。

首先是定義輔助巨集:

#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
#define OVERFLOW -1
typedef int Status;
typedef int QElemType;

鏈佇列的儲存結構定義:

//鏈佇列的儲存結構定義
typedef struct QNode {
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;//隊頭指標
    QueuePtr rear;//隊尾指標
}LinkQueue;

構造一個空佇列Q.

Status InitQueue(LinkQueue &Q){
	//構造一個空佇列Q
    Q.front=(QNode *)malloc(sizeof(QNode));
    if(!Q.front) 
        exit(OVERFLOW); //儲存分配失敗
    Q.rear=Q.front;
    Q.front->next=NULL;
    return OK;
}

銷燬佇列.

Status DestroyQueue(LinkQueue &Q){
	//銷燬佇列
    while(Q.front){ 
       Q.rear=Q.front->next;
       free(Q.front);
       Q.front=Q.rear;
	} 
    Q.front=NULL;
    Q.rear=NULL;
    return OK;
}

向佇列中插入一個元素e.

Status EnQueue(LinkQueue &Q,QElemType e){
	//向佇列中插入一個元素e
   QueuePtr p;
   p=(QueuePtr)malloc(sizeof(QNode));
   if(!p) //儲存分配失敗
	  exit(OVERFLOW);
   p->data=e;
   p->next=NULL;
   Q.rear->next=p;  //修改尾指標
   Q.rear=p;
   return OK;
}

若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK 否則返回ERROR.

Status DeQueue(LinkQueue &Q,QElemType &e){
	//若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK 否則返回ERROR
	if(Q.front==Q.rear)
		return ERROR;
    QueuePtr p=Q.front->next;  
    e=p->data;
    Q.front->next=p->next; 
    if(p==Q.rear) //只有一個結點時修改隊尾指標
        Q.rear=Q.front; 
    free(p);
	p=NULL;
    return OK;
}

清空佇列.

Status ClearQueue(LinkQueue &Q){
	//清空佇列
    QueuePtr p=Q.front->next,q;
    while(p){ 
       q=p->next;
       free(p);
       p=q;
	}  
    Q.rear=Q.front;//修改隊尾指標
    return OK;
}

若佇列為空佇列返回TRUE 否則返回FALSE.

Status QueueEmpty(LinkQueue &Q){
	//若佇列為空佇列返回TRUE 否則返回FALSE
    if(Q.front==Q.rear) 
        return TRUE;
    return FALSE;
}

返回佇列的長度.

int QueueLength(LinkQueue &Q){
	//返回佇列的長度
	int i=0;
    QueuePtr p=Q.front->next,q;
    while(p){ 
        i++;
        p=p->next;
	} 
    return i;
}

若佇列不空用e返回 隊頭元素,並返回OK 否則返回ERROR.

Status GetHead(LinkQueue &Q,QElemType &e){
	//若佇列不空用e返回 隊頭元素,並返回OK 否則返回ERROR
    if(Q.front==Q.rear)
        return ERROR;
    e=Q.front->next->data;
    return OK;
}

從隊頭到隊尾依次對佇列Q中的每個元素呼叫函式visit() 返回OK.一旦visit失敗則操作失敗。是空佇列返回ERROR

Status QueueTraverse(LinkQueue &Q,Status (*visit)(QElemType &)){
	//從隊頭到隊尾依次對佇列Q中的每個元素呼叫函式visit() 返回OK.一旦visit失敗則操作失敗。是空佇列返回ERROR
    if(Q.front==Q.rear)
       return ERROR;
    QueuePtr p=Q.front->next;
    while(p){
        visit(p->data);
        p=p->next;
	}  
    return OK;
}