[2020.5.18]【笔记】队列的一些函数

时间:2020-05-18
本文章向大家介绍[2020.5.18]【笔记】队列的一些函数,主要包括[2020.5.18]【笔记】队列的一些函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;

typedef struct ListNode {  // 定义结点结构
    ElementType data;
    struct ListNode *next;
}node;

typedef struct QueueRecord {  // 定义结构体,用于存放队列的头指针和尾指针
    node *Front;
    node *Rear;
}Queue;

typedef Queue *PtrToQueue;

PtrToQueue InitQueue();void Enqueue(PtrToQueue Q, ElementType element);
void Dequeue(PtrToQueue Q);
void TraverseQueue(PtrToQueue Q);

int main()
{
    PtrToQueue LinkedQueue = InitQueue();
    for (int i = 0; i < 10; i++) {
        Enqueue(LinkedQueue, i);
    }
    TraverseQueue(LinkedQueue);

    Dequeue(LinkedQueue);
    Dequeue(LinkedQueue);
    TraverseQueue(LinkedQueue);

    Enqueue(LinkedQueue, 50);
    TraverseQueue(LinkedQueue);

    DestoryQueue(LinkedQueue);
    TraverseQueue(LinkedQueue);
}

/* 队列初始化 */
PtrToQueue InitQueue()
{
    PtrToQueue queue = (PtrToQueue)malloc(sizeof(Queue));  // 创建一个队列,并动态分配内存
   if(queue == NULL) {  
         perror("malloc failed!\n");
         exit(EXIT_FAILURE);
   }

    queue->Front = queue->Rear = NULL;  // 初始化头指针和尾指针
    return queue;
}

/* 入队 */
void Enqueue(PtrToQueue Q,ElementType element)
{
    node *newNode = (node *)malloc(sizeof(node));  // 新建一个链表结点,用于存放入队元素的值
    if (newNode == NULL) {
        perror("malloc failed!\n");
        exit(EXIT_FAILURE);
    }

    newNode->next = NULL;    
    newNode->data = element;
    if (Q->Rear == NULL) {
        Q->Front = newNode;
        Q->Rear = newNode;
    }
    else {
        Q->Rear->next = newNode;    // 让新结点作为当前尾结点的下一个结点
        Q->Rear = newNode;          // 尾指针指向新结点
    }
}

/* 出队 */
void Dequeue(PtrToQueue Q)
{
    node *delNode = Q->Front;
    if (Q->Front == NULL) {
        printf("队列为空,无法执行出队操作\n");
    }
    if (Q->Front == Q->Rear) {
        Q->Front = NULL;
        Q->Rear = NULL;
        free(delNode);        // 释放结点内存
    }
    else {
        Q->Front = Q->Front->next;
        free(delNode);        // 释放结点内存
    }

}

/* 遍历队列 */
void TraverseQueue(PtrToQueue Q)
{
    node *tmpNode = Q->Front;
    if (tmpNode == NULL) {
        printf("队列为空\n");
    }
    while(tmpNode != NULL) {
        printf("%d ", tmpNode->data);
        tmpNode = tmpNode->next;
    }
    printf("\n");
}
#include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define OK 1
 5 #define ERROR 0
 6 #define MAXQSIZE 10
 7 typedef int Status;   
 8 typedef int QElemType; //定义队列中元素类型
 9 
10 typedef struct
11 {
12     QElemType *base;
13     int front;
14     int rear;
15 }SqQueue;  //定义循环队列类型
16 
17 Status InitQueue(SqQueue & Q) ;//初始化为空队列,分配数组空间
18 Status GetHead(SqQueue Q,QElemType &e) ;//获取队头元素的值并返回在e中
19 Status EnQueue(SqQueue &Q,QElemType e);//队列非法,将元素e入队
20 Status DeQueue(SqQueue &Q,QElemType &e);//队列非法,将元素e入队
21 int QueueLength(SqQueue Q);//求队列的长度
22 
23 int main()
24 {
25     SqQueue Q;
26     int m;
27     QElemType e;
28     InitQueue(Q);
29     scanf("%d",&m);
30     while(m!=0) //m=0表示操作结束
31     {
32         if(m==1) //m=1表示入队
33         {
34             scanf("%d",&e);
35             EnQueue(Q,e);
36         }
37         else if(m==2)//m=2表示出队
38         {
39             DeQueue(Q,e);
40         }
41         scanf("%d",&m);
42     }
43     printf("length=%d\n",QueueLength(Q));
44     if (GetHead(Q,e)==OK)     
45         printf("first=%d",e);
46     else
47         printf("first=NULL");
48     return 0;
49 }
50 
51 Status InitQueue(SqQueue & Q) //初始化为空队列,分配数组空间
52 {
53     Q.base=(QElemType *)malloc(sizeof(QElemType)*MAXQSIZE);
54     if(!Q.base)
55         return ERROR;
56     Q.front=Q.rear=0;
57     return OK;
58 }
59 
60 Status GetHead(SqQueue Q,QElemType &e) //获取队头元素的值并返回在e中
61 {
62     if(Q.rear==Q.front) return ERROR;
63     e=Q.base[Q.front];
64     return OK;
65 }
66 
67 Status EnQueue(SqQueue &Q,QElemType e)//队列非法,将元素e入队
68 {
69     if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
70     Q.base[Q.rear]=e;
71     Q.rear=(Q.rear+1)%MAXQSIZE;
72     return OK;
73 }
74 
75 Status DeQueue(SqQueue &Q,QElemType &e)//队列非法,将元素出队
76 {
77     if(Q.rear==Q.front) return ERROR;
78     e=Q.base[Q.front];
79     Q.front=(Q.front+1)%MAXQSIZE;
80     return OK;
81 }
82 
83 int QueueLength(SqQueue Q)//求队列的长度
84 {
85     return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
86 }

原文地址:https://www.cnblogs.com/fake8864/p/12912661.html