ZBLOG

#include #include #include using namespace std; // 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int QElemType; typedef struct QNode { QElemType data; ...

这段代码是一个基于链表实现的队列的示例,包含了队列的初始化、销毁、清空、判空、求长度等操作。以下是完整代码的注释部分:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0 
#define OVERFLOW -1

typedef int QElemType;

typedef struct QNode {
   QElemType data;
   struct QNode *next;
} *QueuePtr;

struct LinkQueue {
   QueuePtr front, rear; // 队头、队尾指针
};

void print(QElemType i) {
   printf("%d ", i);
}

void InitQueue(LinkQueue &Q); // 构造一个空队列Q
void DestroyQueue(LinkQueue &Q); // 销毁队列Q,Q不再存在
void ClearQueue(LinkQueue &Q); // 将Q清为空队列
int QueueEmpty(LinkQueue Q); // 若队列Q为空队列,则返回TRUE;否则返回FALSE
int QueueLength(LinkQueue Q); // 返回Q的元素个数,即队列的长度
int GetHead(LinkQueue Q, QElemType &e); // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
int EnQueue(LinkQueue &Q, QElemType e); // 插入元素e为Q的新的队尾元素
int DeQueue(LinkQueue &Q, QElemType &e); // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)); // 从队头到队尾依次对队列Q中每个元素调用函数vi()  

int main() {
   int j;
   int i = 0, l;
   QElemType d;
   LinkQueue Q;
   InitQueue(Q);
   for (i = 0; i < 5; i++) {
      scanf("%d", &d);     
      EnQueue(Q, d);
   };
   printf("队列长度为: %d\n", QueueLength(Q));
   printf("现在队列中元素:\n");
   QueueTraverse(Q, print);
   
   DeQueue(Q, d);
   printf("删除的元素是%d\n", d);
   
   DeQueue(Q, d);
   printf("删除的元素是%d\n", d);

   scanf("%d", &d);
   
    EnQueue(Q,d);
    printf("队列长度为: %d\n", QueueLength(Q));
    printf("现在队列中元素:\n");
    QueueTraverse(Q, print);

    j = GetHead(Q, d);
    if (j) {
        printf("现在队头元素为:%d\n", d);
    }
    
    ClearQueue(Q);
    DestroyQueue(Q);
}

void InitQueue(LinkQueue &Q) { 
  // 构造一个空队列Q
  Q.front = Q.rear = new QNode;
  if (!Q.front) exit(OVERFLOW); // 存储分配失败
  Q.front->next = NULL;
}

void DestroyQueue(LinkQueue &Q) { 
// 销毁队列Q(无论空否均可)
  while (Q.front) {
      Q.rear = Q.front->next;
      delete Q.front;
      Q.front = Q.rear;
  }
}

void ClearQueue(LinkQueue &Q) { 
// 将Q清为空队列
  QueuePtr p, q;
  Q.rear = Q.front; // 队尾指针也指向头结点,使链表中无任何元素
  p = Q.front->next; // 指向首元结点
  while (p) { // 遍历删除所有结点
    q = p->next;
    delete p;
    p = q;
  }
  Q.front->next = NULL; // 头结点的指针域置空
}

int QueueEmpty(LinkQueue Q) {
// 若Q为空队列,则返回TRUE,否则返回FALSE
   if (Q.front == Q.rear) return TRUE;
   else return FALSE;
}

int QueueLength(LinkQueue Q) { 
// 求队列的长度
   int len = 0;
   QueuePtr p = Q.front->next; // 指向首元结点
   while (p) {
       len++;
       p = p->next;
   }
   return len;
}

int GetHead(LinkQueue Q, QElemType &e) { 
// 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
    if (Q.front == Q.rear)
        return ERROR; // 队列为空,无法获取队头元素
    e = Q.front->next->data; // 获取队头元素的值
    return OK;
 }

int EnQueue(LinkQueue &Q, QElemType e) { 
// 插入元素e为Q的新的队尾元素
    QueuePtr p = new QNode;
    if (!p) exit(OVERFLOW); // 存储分配失败
    p->data = e;
    p->next = NULL;
    Q.rear->next = p; // 新结点插入队尾
    Q.rear = p; // 队尾指针指向新结点
    return OK;
}

int DeQueue(LinkQueue &Q, QElemType &e) { 
// 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
   if (Q.front == Q.rear)
       return ERROR; // 队列为空,无法删除元素
   QueuePtr p = Q.front->next; // 指向首元结点
   e = p->data; // 获取队头元素的值
   Q.front->next = p->next; // 头结点的后继指针指向第二个结点
   if (Q.rear == p)  // 如果删除后队列为空,修改队尾指针
       Q.rear = Q.front;
   delete p; // 释放原队头结点的空间
   return OK;
}

void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)) {
// 从队头到队尾依次对队列Q中每个元素调用函数vi()
  QueuePtr p = Q.front->next; // 指向首元结点
  while (p) {
      vi(p->data);
      p = p->next;
  }
}

以上代码实现了一个链式队列,包含了初始化队列、销毁队列、清空队列、判断队列是否为空、获取队头元素、插入元素到队尾以及删除队头元素等操作。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9462

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?