隊列

//隊列 ,鏈隊,循環隊
/基本操作有:
初始化隊列,隊列是否爲空,獲取元素,入隊,出隊,隊列長度
清空隊列,銷燬隊列
/
//鏈式隊列
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define QUEUE_INIT_SIZE 50//隊列初始化長度
#define QUEUE_INCREMENT 20//隊滿時追加的長度

typedef int ElemType;//定義數據別名
typedef int Status;//定義別名
//結點類型
typedef struct Qnode{
ElemType data;
struct Qnode next;
}Qnode,
QueuePtr;

typedef struct{
QueuePtr front;//隊頭指針
QueuePtr rear;//隊尾指針
}LinkQueue;

/
函數聲明
/
Status InitQueue(LinkQueue Q); //初始化
Status EnQueue(LinkQueue
Q,ElemType e);//入隊
Status DeQueue(LinkQueue Q);//出隊
Status Traverse(LinkQueue
Q);//遍歷

//主函數
int main(void){
LinkQueue Q;
InitQueue(&Q);
for(int i = 0; i<=10; i++){
EnQueue(&Q,i+1);
}
Traverse(&Q);
}

//初始化隊列
Status InitQueue(LinkQueue Q){
//構造一個空隊列
// LinkQueue
Q;
Qnode basenode;
basenode = (Qnode
)malloc (sizeof(Qnode));
Q->front = Q->rear = basenode;
if(!Q->front){
printf("初始化鏈式隊列失敗!\n");
return OVERFLOW;
}
Q->front->next = NULL;
printf("初始化隊列成功!\n");
return OK;
}

//入隊
Status EnQueue(LinkQueue Q,ElemType e){//插入隊尾
Qnode
newnode;//新結點
newnode = (Qnode*) malloc(sizeof(Qnode));
if(!newnode){//內存分配失敗
printf("插入時分配空間失敗!\n");
return ERROR;
}
printf("當前入隊--[%d]\n",e);
newnode->data = e;//將要插入的值賦給新的結點
newnode->next = NULL;//尾插法插入,最後一個結點指向爲空
Q->rear->next = newnode;//隊尾指向新結點
Q->rear = newnode;//
// Traverse(Q);
return OK;
}

//出隊
Status DeQueue(LinkQueue Q){
ElemType Elem;//保存出隊元素
if(Q->front == Q->rear){//當前隊列爲空
printf("隊列爲空!\n");
return ERROR;
}
Qnode
p;//活動指針
p = Q->front->next;//p指向頭結點的下一個結點,即隊列的第一個結點,即隊頭
Elem = p->data;//取出隊頭結點的元素值
Q->front->next = p->next;//將隊頭結點刪除
printf("當前出隊元素:%d\n",Elem);
if(Q->rear == p){//如果當前刪除的元素是隊列中的最後一個元素
Q->rear = Q->front;//使隊尾指針指向隊頭結點,否則隊尾指針就變成
}
free(p);//釋放隊頭結點的空間
return OK;
}

//遍歷
Status Traverse(LinkQueue Q){
printf("遍歷鏈隊的內容是:");
if(Q->front == Q->rear){
printf("當前隊列爲空\n");
return ERROR;
}
Qnode
p;
p = Q->front->next;
while(p){
printf("-[%d]",p->data);
p = p->next;
}
printf("\n");
return OK;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章