当前位置:编程学习 > C/C++ >>

队列基本操作

队列是先进先出的数据结构,出队的一端叫队首,入队的一端叫队尾,就像是日常生活中排队买火车票一样,下面是队列的基本操作

创建史带头节点的链表


[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重新赋值  将元素插入

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,