数据结构队列的基本操作

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

// 链表:队列的链式存储结构
typedef struct QueueNode
{
    char date;
    struct QueueNode *next;
}qnode, *QueuePtr;
// 指向队列头和尾的指针结构体
typedef struct
{
    QueuePtr front; // 队头指针
    QueuePtr rear;  // 队尾指针
}queue;

int main()
{
    // 构造一个空队列
    void InitQueue(queue *q);
    // 向队尾插入元素
    void InsertQueue(queue *q, char e);
    // 若队列不为空,删除队头元素,并用e返回其值
    void DelHead(queue *q, char e );
    // 销毁队列
    void DestoryQueue(queue *q);
    // 判断队列是否为空,若空则返回1,不空返回0
    int QueueEmpty(queue *q);
    // 返回队列的长度,即元素个数
    int QueueLength(queue *q);
    // 若队列不为空则返回,用e返回队头元素
    char GetHead(queue *q, char e);

    // 定义
    queue q;
    char e='a';
    char t;
    int temp;

    InitQueue(&q);
    InsertQueue(&q,e);InsertQueue(&q,e);InsertQueue(&q,e);
    DelHead(&q, e);
    temp = QueueEmpty(&q);
    if(temp)
        printf("The queue is empty!\n");
    else
        printf("The queue isn't empty!\n");
    temp = QueueLength(&q);
    printf("The length is:%d\n",temp);
    t = GetHead(&q, e);
    printf("%c\n",t);
    DestoryQueue(&q);

    return 0;
}
// 构造一个空队列
void InitQueue(queue *q)
{
    // 第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用
    q->front = q->rear = (qnode *)malloc(sizeof(qnode));
    if(!q->front)
        exit(0);
    q->front->next = NULL;
    printf("Success to create queue!\n");
}
// 向队尾插入元素
void InsertQueue(queue *q, char e)
{
    qnode *node;
    node = (qnode *)malloc(sizeof(qnode));// 注意:malloc函数要用指针指向
    if(!node)
        exit(0);
    node->date = e;
    node->next = NULL;
    q->rear->next = node; // 未插入时链队列的最后一个元素的下一个指针域,使其连接到下一个插入元素
    q->rear = node; // 表示最后一个元素为node
    printf("Success to insert:%c\n",e);
}
// 若队列不为空,删除队头元素,并用e返回其值
void DelHead(queue *q, char e )
{
    // 定义,node用于指向头结点的下一个,即第一个对头元素
    QueuePtr node;

    // 如果队列为空,则退出
    if(q->front == q->rear)
        exit(0);
    // 若不为空,则删除后返回删除的队头元素
    node = q->front->next; // node指向头结点的下一个节点
    e = node->date; // node节点的date赋值给e,以便返回节点信息
    q->front->next = node->next; // node的下一个节点赋值给头结点的下一个节点,即删除对头的元素
    // 如果只有头结点,没有队头元素时队头指针和队尾指针指向相同的节点
    if(q->rear == node)
        q->rear = q->front;
    free(node); // 释放删除的节点
    printf("Success to delete the head element!\n");
}
// 销毁队列,无论空与否均可
void DestoryQueue(queue *q)
{
    while(q->front)
    {
        q->rear = q->front->next; // 队列的尾节点指向头结点的下一个节点
        free(q->front); // 释放头结点
        q->front = q->rear; // 使头结点和尾节点指向同一节点
    }
    printf("Success to destory queue!\n");
}
// 判断队列是否为空,若空则返回1,不空返回0
int QueueEmpty(queue *q)
{
    // 如果队列为空
    if(q->front->next == NULL)
        return 1;
    else
        return 0;
}
// 返回队列的长度,即元素个数
int QueueLength(queue *q)
{
    int cnt=0;
    qnode *node;

    node = q->front; // 使node指向队头结点
    while(node != q->rear)
    {
        cnt++;
        node = node->next;
    }
    return cnt;
}
// 若队列不为空则返回,用e返回队头元素
char GetHead(queue *q, char e)
{
    // 判断队列是否为空,若为空则退出
    if(q->front->next == NULL)
        exit(0);
    e = q->front->next->date;
    return e;
}



总结:
1、(1)q->front:表示头结点
  (2)q->rear:表示尾节点
  (3)q->front->next:表示头结点的下一个节点
  (4)q->rear->next:表示尾节点的下一个节点
2、warning:'e' is used uninitialized in this function  因为e只定义却未付值,开始给e赋值就解决了
3、注意:构造栈时,第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用
4、注意:变量要对其赋初值,否则会出错!求队列长度时未赋初值导致队列长度每次运行都是不同的长度值


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值