队列的基本代码【C语言版本】

队列先不考虑循环队列,
作为链表而言,只能在尾部插入新元素,在头节点删除,其他位置不能改变。

而循环队列,特殊情况特殊考虑,还要考虑存储空间的大小。
有的时候还有双向链表的队列,麻烦死我了!

顺序队列

typedef int Position;
struct QNode {
    ElementType *Data;     /* 存储元素的数组 */
    Position Front, Rear;  /* 队列的头、尾指针 */
    int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode *Queue;
 
Queue CreateQueue( int MaxSize )
{
    Queue Q = (Queue)malloc(sizeof(struct QNode));
    Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
    Q->Front = Q->Rear = 0;
    Q->MaxSize = MaxSize;
    return Q;
}
 
bool IsFull( Queue Q )
{
    return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}
 
bool AddQ( Queue Q, ElementType X )
{
    if ( IsFull(Q) ) {
        printf("队列满");
        return false;
    }
    else {
        Q->Rear = (Q->Rear+1)%Q->MaxSize;
        Q->Data[Q->Rear] = X;
        return true;
    }
}
 
bool IsEmpty( Queue Q )
{
    return (Q->Front == Q->Rear);
}
 
ElementType DeleteQ( Queue Q )
{
    if ( IsEmpty(Q) ) { 
        printf("队列空");
        return ERROR;
    }
    else  {
        Q->Front =(Q->Front+1)%Q->MaxSize;
        return  Q->Data[Q->Front];
    }
}

链队列

typedef struct Node *PtrToNode;
struct Node { /* 队列中的结点 */
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode Position;
 
struct QNode {
    Position Front, Rear;  /* 队列的头、尾指针 */
    int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode *Queue;
 
bool IsEmpty( Queue Q )
{
    return ( Q->Front == NULL);
}
 
ElementType DeleteQ( Queue Q )
{
    Position FrontCell; 
    ElementType FrontElem;
     
    if  ( IsEmpty(Q) ) {
        printf("队列空");
        return ERROR;
    }
    else {
        FrontCell = Q->Front;
        if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
            Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
        else                     
            Q->Front = Q->Front->Next;
        FrontElem = FrontCell->Data;
 
        free( FrontCell );  /* 释放被删除结点空间  */
        return  FrontElem;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
队列基本操作包括:初始化、入队、出队、获取队头元素、判断队列是否为空、获取队列长度。 下面是链队列基本操作的代码实现: ```c #include <stdio.h> #include <stdlib.h> // 链队列结点 typedef struct QNode { int data; struct QNode *next; } QNode; // 队列结构体 typedef struct { QNode *front; // 队头指针 QNode *rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = q->rear = (QNode *) malloc(sizeof(QNode)); if (q->front == NULL) { printf("初始化队列失败,内存分配失败!\n"); exit(-1); } q->front->next = NULL; } // 入队 void enQueue(Queue *q, int data) { QNode *p = (QNode *) malloc(sizeof(QNode)); if (p == NULL) { printf("入队失败,内存分配失败!\n"); exit(-1); } p->data = data; p->next = NULL; q->rear->next = p; q->rear = p; } // 出队 void deQueue(Queue *q) { if (q->front == q->rear) { printf("出队失败,队列已空!\n"); exit(-1); } QNode *p = q->front->next; q->front->next = p->next; if (q->rear == p) q->rear = q->front; free(p); } // 获取队头元素 int getFront(Queue *q) { if (q->front == q->rear) { printf("获取队头元素失败,队列已空!\n"); exit(-1); } QNode *p = q->front->next; return p->data; } // 判断队列是否为空 int isEmpty(Queue *q) { return q->front == q->rear; } // 获取队列长度 int getLength(Queue *q) { int len = 0; QNode *p = q->front->next; while (p != NULL) { len++; p = p->next; } return len; } // 打印队列中的元素 void printQueue(Queue *q) { QNode *p = q->front->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { Queue q; initQueue(&q); // 入队 enQueue(&q, 1); enQueue(&q, 2); enQueue(&q, 3); printf("队列中的元素为:"); printQueue(&q); // 出队 deQueue(&q); printf("出队后队列中的元素为:"); printQueue(&q); // 获取队头元素 printf("队头元素为:%d\n", getFront(&q)); // 判断队列是否为空 printf("队列是否为空:%d\n", isEmpty(&q)); // 获取队列长度 printf("队列长度为:%d\n", getLength(&q)); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值