C语言队列实现

头文件

#ifndef Queue_H
#define Queue_H

typedef int Item;
typedef struct node * PNode;
typedef struct node
{
    Item data;
    PNode next;
}Node;

typedef struct
{
    PNode front;
    PNode rear;
    int size;
}Queue;

/*构造一个空队列*/
Queue *InitQueue();

/*销毁一个队列*/
void DestroyQueue(Queue *pqueue);

/*清空一个队列*/
void ClearQueue(Queue *pqueue);

/*判断队列是否为空*/
int IsEmpty(Queue *pqueue);

/*返回队列大小*/
int GetSize(Queue *pqueue);

/*返回队头元素*/
PNode GetFront(Queue *pqueue,Item *pitem);

/*返回队尾元素*/
PNode GetRear(Queue *pqueue,Item *pitem);

/*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item);

/*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item *pitem);

/*遍历队列并对各数据项调用visit函数*/
void QueueTraverse(Queue *pqueue,void (*visit)());

#endif

代码原文

#include"Queue.h"
#include<malloc.h>
#include<stdio.h>

/*构造一个空队列*/
Queue *InitQueue()
{
    Queue *pqueue = (Queue *)malloc(sizeof(Queue));
    if(pqueue!=NULL)
    {
        pqueue->front = NULL;
        pqueue->rear = NULL;
        pqueue->size = 0;
    }
    return pqueue;
}

/*销毁一个队列*/
void DestroyQueue(Queue *pqueue)
{
    if(IsEmpty(pqueue)!=1)
        ClearQueue(pqueue);
    free(pqueue);
}

/*清空一个队列*/
void ClearQueue(Queue *pqueue)
{
    while(IsEmpty(pqueue)!=1)
    {
        DeQueue(pqueue,NULL);
    }

}

/*判断队列是否为空*/
int IsEmpty(Queue *pqueue)
{
    if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
        return 1;
    else
        return 0;
}

/*返回队列大小*/
int GetSize(Queue *pqueue)
{
    return pqueue->size;
}

/*返回队头元素*/
PNode GetFront(Queue *pqueue,Item *pitem)
{
    if(IsEmpty(pqueue)!=1&&pitem!=NULL)
    {
        *pitem = pqueue->front->data;
    }
    return pqueue->front;
}

/*返回队尾元素*/

PNode GetRear(Queue *pqueue,Item *pitem)
{
    if(IsEmpty(pqueue)!=1&&pitem!=NULL)
    {
        *pitem = pqueue->rear->data;
    }
    return pqueue->rear;
}

/*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item)
{
    PNode pnode = (PNode)malloc(sizeof(Node));
    if(pnode != NULL)
    {
        pnode->data = item;
        pnode->next = NULL;

        if(IsEmpty(pqueue))
        {
            pqueue->front = pnode;
        }
        else
        {
            pqueue->rear->next = pnode;
        }
        pqueue->rear = pnode;
        pqueue->size++;
    }
    return pnode;
}

/*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item *pitem)
{
    PNode pnode = pqueue->front;
    if(IsEmpty(pqueue)!=1&&pnode!=NULL)
    {
        if(pitem!=NULL)
            *pitem = pnode->data;
        pqueue->size--;
        pqueue->front = pnode->next;
        free(pnode);
        if(pqueue->size==0)
            pqueue->rear = NULL;
    }
    return pqueue->front;
}

/*遍历队列并对各数据项调用visit函数*/
void QueueTraverse(Queue *pqueue,void (*visit)())
{
    PNode pnode = pqueue->front;
    int i = pqueue->size;
    while(i--)
    {
        visit(pnode->data);
        pnode = pnode->next;
    }

}

测试函数

#include"Queue.h"
#include<stdio.h>
void print(Item i)
{
    printf("该节点元素为%d\n",i);
}
main()
{
    Queue *pq = InitQueue();
    int i,item;
    printf("0-9依次入队并输出如下:\n");
    for(i=0;i<10;i++)
    {
        EnQueue(pq,i);
        GetRear(pq,&item);
        printf("%d ",item);
    }

    printf("\n从队头到队尾遍历并对每个元素执行print函数:\n");
    QueueTraverse(pq,print);

    printf("队列中元素依次出队列并输出如下:\n");
    for(i=0;i<10;i++)
    {
        DeQueue(pq,&item);
        printf("%d ",item);
    }
    ClearQueue(pq);
    if(IsEmpty(pq))
        printf("\n将队列置空成功\n");
    DestroyQueue(pq);
    printf("队列已被销毁\n");
}

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
约瑟夫环问题是一个经典的问题,可以使用队列实现。 具体步骤如下: 1. 首先定义一个结构体表示队列节点,包含一个整型数据成员和一个指向下一个节点的指针成员。 ```c typedef struct node { int data; struct node *next; } Node; ``` 2. 定义一个队列结构体,包含一个指向队首节点的指针和一个指向队尾节点的指针。 ```c typedef struct queue { Node *front; Node *rear; } Queue; ``` 3. 定义队列的初始化函数,创建一个空队列。 ```c void initQueue(Queue *q) { q->front = q->rear = NULL; } ``` 4. 定义入队函数,将元素插入队尾。 ```c void enqueue(Queue *q, int data) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (q->rear == NULL) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } } ``` 5. 定义出队函数,将队首元素删除并返回其值。 ```c int dequeue(Queue *q) { if (q->front == NULL) { return -1; // 队列为空,返回-1表示出队失败 } Node *frontNode = q->front; int data = frontNode->data; if (q->front == q->rear) { q->front = q->rear = NULL; } else { q->front = frontNode->next; } free(frontNode); return data; } ``` 6. 实现约瑟夫环算法,依次将所有人入队,然后每次出队第m个人,直到队列中只剩下一个人。 ```c void josephus(int n, int m) { Queue q; initQueue(&q); // 将所有人入队 for (int i = 1; i <= n; i++) { enqueue(&q, i); } // 每次出队第m个人,直到队列中只剩下一个人 while (q.front != NULL) { for (int i = 1; i < m; i++) { enqueue(&q, dequeue(&q)); // 将前m-1个人重新入队 } printf("%d ", dequeue(&q)); // 第m个人出队并打印 } } ``` 完整代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值