下午把隊列的各種操作用鏈表實現了一下,建立,插入元素,刪除元素,讀取元素,全部刪除,全部讀出,判斷是否為空,清空,源代碼調試已經通過,運行結果如下圖所示:
[cpp]
#include "iostream"
using namespace std;
typedef struct student
{
int data;
struct student * next;
}node;//定義結構體節點
typedef struct linkqueue
{
node * first;
node * rear;
}queue;//定義隊列結構,首指針和尾指針
/*******************************
函數名:void initqueue(queue *HQ)
功能:初始化 把隊首和隊尾指針置空
********************************/
void initqueue(queue *HQ)
{
HQ->first=HQ->rear=NULL;
}
/**************************************
函數名:queue *insert(queue *HQ,int x)
功能:向隊列中添加一個新元素,在尾節點之後
***************************************/
queue *insert(queue *HQ,int x)
{
node * s;
s=new node;
s->data=x;
s->next=NULL;
if (HQ->rear==NULL)
{
HQ->first=s;
HQ->rear=s;
}
else
{
HQ->rear->next=s;
HQ->rear=s;
}
return HQ;
}
/******************************
函數名:int delqueue(queue *HQ)
功能:從隊列中刪除一個元素*
*******************************/
int delqueue(queue *HQ)
{
node *p;
int temp;
/*若鏈隊為空則停止運行*/
if(HQ->first==NULL)
{
printf("隊列為空,無法刪除! ");
exit(1);
}
temp=HQ->first->data;
/*暫存隊首元素以便返回*/
p=HQ->first;
/*暫存隊首指針以便回收隊尾結點*/
HQ->first=p->next; /*使隊首指針指向下一個結點*/
/*若刪除後鏈隊為空,則需同時使隊尾指針為空*/
if(HQ->first==NULL)
{
HQ->rear=NULL;
}
free(p); /*回收原隊首結點*/
return temp; /*返回被刪除的隊首元素值*/
}
/*******************************
函數名:int readqueue(queue *HQ)
功能:讀取隊首元素*
********************************/
int readqueue(queue *HQ)
{ /*若鏈隊為空則停止運行*/
if(HQ->first==NULL)
{
cout<<"隊列為空,無法刪除! ";
exit(1);
}
return HQ->first->data; /*返回隊首元素*/
}
/*************************************************
函數名:int emptyqueue(queue *HQ)
功能:檢查鏈隊是否為空,若為空則返回1,否則返回0
************************************************/
int emptyqueue(queue *HQ)
{
/*判斷隊首或隊尾任一個指針是否為空即可*/
if(HQ->first==NULL)
{
return 1;
}
else
{
return 0;
}
}
/***********************************
函數名:void clearqueue(queue *HQ)
功能:清除鏈隊中的所有元素*
***********************************/
void clearqueue(queue *HQ)
{
node *p=HQ->first; /*隊首指針賦給p*/
/*依次刪除隊列中的每一個結點,最後使隊首指針為空*/
while(p!=NULL)
{
HQ->first=HQ->first->next;
free(p);
p=HQ->first;
}
/*循環結束後隊首指針已經為空*/
HQ->rear=NULL; /*置隊尾指針為空*/
}
/*******************************
函數名:void readall(queue *HQ)
功能:輸出鏈隊中的所有元素
*********************************/
void readall(queue *HQ)
{
node *p=HQ->first;
while (p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}
}
void main()
{
queue q;
int a[5]={1,2,3,4,5};
int i;
initqueue(&q);
for(i=0;i<5;i++)
{
insert(&q,a[i]);
}//隊列中插入數據 1,2,3,4,5
cout<<endl<<"讀取隊列中全部的數據:\n";
readall(&q);//讀取隊列中全部數據
insert(&q,60);//插入一個數據
cout<<"讀取的隊首節點:"<<readqueue(&q)<<endl;//讀取隊首元素
cout<<endl;
while(!emptyqueue(&q))
{
cout<<"刪除的節點:"<<delqueue(&q)<<endl;;
cout<<"剩下的節點"<<endl;
readall(&q);
}
clearqueue(&q);
}
#include "iostream"
using namespace std;
typedef struct student
{
int data;
struct student * next;
}node;//定義結構體節點
typedef struct linkqueue
{
node * first;
node * rear;
}queue;//定義隊列結構,首指針和尾指針
/*******************************
函數名:void initqueue(queue *HQ)
功能:初始化 把隊首和隊尾指針置空
********************************/
void initqueue(queue *HQ)
{
HQ->first=HQ->rear=NULL;
}
/**************************************
函數名:queue *insert(queue *HQ,int x)
功能:向隊列中添加一個新元素,在尾節點之後
***************************************/
queue *insert(queue *HQ,int x)
{
node * s;
s=new node;
s->data=x;
s->next=NULL;
if (HQ->rear==NULL)
{
HQ->first=s;
HQ->rear=s;
}
else
{
HQ->rear->next=s;
HQ->rear=s;
}
return HQ;
}
/******************************
函數名:int delqueue(queue *HQ)
功能:從隊列中刪除一個元素*
*******************************/
int delqueue(queue *HQ)
{
node *p;
int temp;
/*若鏈隊為空則停止運行*/
if(HQ->first==NULL)
{
printf("隊列為空,無法刪除! ");
exit(1);
}
temp=HQ->first->data;
/*暫存隊首元素以便返回*/
p=HQ->first;
/*暫存隊首指針以便回收隊尾結點*/
HQ->first=p->next; /*使隊首指針指向下一個結點*/
/*若刪除後鏈隊為空,則需同時使隊尾指針為空*/
if(HQ->first==NULL)
{
HQ->rear=NULL;
}
free(p); /*回收原隊首結點*/
return temp; /*返回被刪除的隊首元素值*/
}
/*******************************
函數名:int readqueue(queue *HQ)
功能:讀取隊首元素*
********************************/
int readqueue(queue *HQ)
{ /*若鏈隊為空則停止運行*/
if(HQ->first==NULL)
{
cout<<"隊列為空,無法刪除! ";
exit(1);
}
return HQ->first->data; /*返回隊首元素*/
}
/*************************************************
函數名:int emptyqueue(queue *HQ)
功能:檢查鏈隊是否為空,若為空則返回1,否則返回0
************************************************/
int emptyqueue(queue *HQ)
{
/*判斷隊首或隊尾任一個指針是否為空即可*/
if(HQ->first==NULL)
{
return 1;
}
else
{
return 0;
}
}
/***********************************
函數名:void clearqueue(queue *HQ)
功能:清除鏈隊中的所有元素*
***********************************/
void clearqueue(queue *HQ)
{
node *p=HQ->first; /*隊首指針賦給p*/
/*依次刪除隊列中的每一個結點,最後使隊首指針為空*/
while(p!=NULL)
{
HQ->first=HQ->first->next;
free(p);
p=HQ->first;
}
/*循環結束後隊首指針已經為空*/
HQ->rear=NULL; /*置隊尾指針為空*/
}
/*******************************
函數名:void readall(queue *HQ)
功能:輸出鏈隊中的所有元素
*********************************/
void readall(queue *HQ)
{
node *p=HQ->first;
while (p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}
}
void main()
{
queue q;
int a[5]={1,2,3,4,5};
int i;
initqueue(&q);
for(i=0;i<5;i++)
{
insert(&q,a[i]);
}//隊列中插入數據 1,2,3,4,5
cout<<endl<<"讀取隊列中全部的數據:\n";
readall(&q);//讀取隊列中全部數據
insert(&q,60);//插入一個數據
cout<<"讀取的隊首節點:"<<readqueue(&q)<<endl;//讀取隊首元素
cout<<endl;
while(!emptyqueue(&q))
{
cout<<"刪除的節點:"<<delqueue(&q)<<endl;;
cout<<"剩下的節點"<<endl;
readall(&q);
}
clearqueue(&q);
}
運行結果:
[cpp] <PRE class=cpp name="code"></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>