資料結構-鏈佇列
阿新 • • 發佈:2018-12-13
佇列類似線性表和棧,也是定義線上性結構上的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;
}