隊列是先進先出的數據結構,出隊的一端叫隊首,入隊的一端叫隊尾,就像是日常生活中排隊買火車票一樣,下面是隊列的基本操作
創建史帶頭節點的鏈表
[cpp] #include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW 0
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)
{
q.front=q.rear=(queuePtr)malloc(sizeof(QNode)); //創建頭節點 頭指針指向頭節點
if(!q.front) //創建失敗
{
exit(OVERFLOW);
}
q.front->next=NULL;
return OK;
}
//銷毀隊列
status destoryQueue(LinkQueue &q)
{
while(q.front)
{
q.rear=q.front->next; //將頭節點的next賦給尾指針
free(q.front); //刪除頭節點
q.front=q.rear; //重新生成為節點
}
printf("隊列銷毀成功!\n");
q.front=NULL;
return OK; //刪除完成返回OK
}
//進行元素插入
status enQueue(LinkQueue &q,elemtype e)
{
queuePtr p=(queuePtr)malloc(sizeof(QNode)); //為新元素分配空間
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
q.rear->next=p; //為尾指針的next重新賦值 將元素插入表尾
q.rear=p; //重新定位尾指針
return OK;
}
//刪除元素
status deQueue(LinkQueue &q)
{
if(q.front==q.rear) return ERROR; //此時隊列為空
queuePtr p=q.front->next;
// e=p->data; //刪除是dui首
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
free(p);
printf("元素刪除成功!\n");
return OK;
}
//獲得隊首元素
status getHead(LinkQueue &q)
{
queuePtr p=q.front->next;
printf("%d\n",p->data);
return OK;
}
//輸出隊列
status printQueue(LinkQueue q)
{
queuePtr p;
p=q.front->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return OK;
}
int main()
{
LinkQueue q;
int i,j,k,m;
initQueue(q);//進行隊列的初始化:
printf("插入幾個數據:\n");
scanf("%d",&i);
for(j=0;j<i;j++)
{ printf("請輸入第%d個整數",j+1);
scanf("%d",&k);
enQueue(q,k);
}
do
{
printf("請根據提示進行相應操作:\n");
printf("刪除元素選擇輸入1:\n");
printf("清空隊列選擇輸入2:\n");
printf("輸出隊列選擇輸入3:\n");
printf("退出輸入4:\n");
scanf("%d",&m);
switch(m)
{
case 1: deQueue(q); break;
case 2: destoryQueue(q); break;
case 3: printQueue(q);break;
default: printf("請重新輸入:\n");break;
}
}while(m!=4);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW 0
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)
{
q.front=q.rear=(queuePtr)malloc(sizeof(QNode)); //創建頭節點 頭指針指向頭節點
if(!q.front) //創建失敗
{
exit(OVERFLOW);
}
q.front->next=NULL;
return OK;
}
//銷毀隊列
status destoryQueue(LinkQueue &q)
{
while(q.front)
{
q.rear=q.front->next; //將頭節點的next賦給尾指針
free(q.front); //刪除頭節點
q.front=q.rear; //重新生成為節點
}
printf("隊列銷毀成功!\n");
q.front=NULL;
return OK; //刪除完成返回OK
}
//進行元素插入
status enQueue(LinkQueue &q,elemtype e)
{
queuePtr p=(queuePtr)malloc(sizeof(QNode)); //為新元素分配空間
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
q.rear->next=p; //為尾指針的next重新賦值 將元素插入表尾
q.rear=p; //重新定位尾指針
return OK;
}
//刪除元素
status deQueue(LinkQueue &q)
{
if(q.front==q.rear) return ERROR; //此時隊列為空
queuePtr p=q.front->next;
// e=p->data; //刪除是dui首
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
free(p);
printf("元素刪除成功!\n");
return OK;
}
//獲得隊首元素
status getHead(LinkQueue &q)
{
queuePtr p=q.front->next;
printf("%d\n",p->data);
return OK;
}
//輸出隊列
status printQueue(LinkQueue q)
{
queuePtr p;
p=q.front->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return OK;
}
int main()
{
LinkQueue q;
int i,j,k,m;
initQueue(q);//進行隊列的初始化:
printf("插入幾個數據:\n");
scanf("%d",&i);
for(j=0;j<i;j++)
{ printf("請輸入第%d個整數",j+1);
scanf("%d",&k);
enQueue(q,k);
}
do
{
printf("請根據提示進行相應操作:\n");
printf("刪除元素選擇輸入1:\n");
printf("清空隊列選擇輸入2:\n");
printf("輸出隊列選擇輸入3:\n");
printf("退出輸入4:\n");
scanf("%d",&m);
switch(m)
{
case 1: deQueue(q); break;
case 2: destoryQueue(q); break;
case 3: printQueue(q);break;
default: printf("請重新輸入:\n");break;
}
}while(m!=4);
return 0;
}