单向链(带头)式队列实现

#include <stdio.h>
#include "queue.h"
#include <stdlib.h>

/** * 单向链(带头)式队列: 尾入头出 */ 

typedef struct LinkNode {
    LinkNode *next;
    int data;
} LinkNode;

typedef struct Queue {
    LinkNode *front;
    LinkNode *rear;
} Queue;



//初始化操作
void InitQueue(Queue *sq) {
    LinkNode *head = (LinkNode *) malloc(sizeof(LinkNode));
    head->next = NULL;
    sq->front = head;
    sq->rear = head;
}

//入队
void Enqueue(Queue *q, int val) {

    if (q == NULL) {
        return;
    }

    LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
    p->data = val;
    p->next = NULL;

    q->rear->next = p;
    q->rear = p;
    if (q->front->next == NULL) {
        q->front->next = p;
    }
}

//出队
int Dequeue(Queue *sq) {

    if (sq == NULL) {
        return -1;
    }

    if (sq->front == sq->rear) {
        return -1;
    }
    LinkNode *p = sq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
队列带头节点的单向循环链表示可以用如下结构体表示: ``` typedef struct Node { int data; struct Node *next; } Node, *Queue; // 初始化队列,创建头节点 void initQueue(Queue *rear) { *rear = (Queue) malloc(sizeof(Node)); (*rear)->next = *rear; } // 判断队列是否为空 int isQueueEmpty(Queue rear) { return rear->next == rear; } // 入队列,在队尾插入元素 void enqueue(Queue *rear, int data) { Node *newNode = (Node*) malloc(sizeof(Node)); newNode->data = data; newNode->next = (*rear)->next; (*rear)->next = newNode; *rear = newNode; } // 出队列,删除队头元素 int dequeue(Queue *rear) { if (isQueueEmpty(*rear)) { printf("队列为空\n"); return -1; } Node *p = (*rear)->next; int data = p->data; (*rear)->next = p->next; if (p == *rear) { *rear = (*rear)->next; } free(p); return data; } // 遍历队列 void traverseQueue(Queue rear) { if (isQueueEmpty(rear)) { printf("队列为空\n"); return; } Node *p = rear->next; while (p != rear) { printf("%d ", p->data); p = p->next; } printf("%d\n", p->data); } ``` 其中,`initQueue`函数用于初始化队列,创建头节点;`isQueueEmpty`函数用于判断队列是否为空;`enqueue`函数用于在队尾插入元素;`dequeue`函数用于删除队头元素;`traverseQueue`函数用于遍历队列。 下面是一个使用该队列结构体的例子: ``` int main() { Queue rear; initQueue(&rear); int i; for (i = 0; i < 5; i++) { enqueue(&rear, i); } traverseQueue(rear); dequeue(&rear); traverseQueue(rear); return 0; } ``` 该例子中,首先调用`initQueue`函数初始化队列,然后使用`enqueue`函数入队列,使用`traverseQueue`函数遍历队列,使用`dequeue`函数出队列并再次遍历队列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值