程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 隊列用鏈表實現(建立,插入新元素,刪除元素,讀取元素,全部刪除,全部讀出,判斷是否為空,清空)

隊列用鏈表實現(建立,插入新元素,刪除元素,讀取元素,全部刪除,全部讀出,判斷是否為空,清空)

編輯:C++入門知識

下午把隊列的各種操作用鏈表實現了一下,建立,插入元素,刪除元素,讀取元素,全部刪除,全部讀出,判斷是否為空,清空,源代碼調試已經通過,運行結果如下圖所示:


[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> 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved