队列-链表-带头结点

本文介绍了如何使用C语言实现一个基础的队列数据结构,包括定义链表节点(LNode)和队列(LinkQueue),提供了初始化、判断队列是否为空、获取长度、创建队列、元素入队和出队等关键函数的示例。
摘要由CSDN通过智能技术生成

1. **队列的结构定义:**
   - `LNode` 结构体定义了链表节点,包含一个整数数据域 `data` 和指向下一个节点的指针 `next`。
   - `LinkQueue` 结构体定义了带有头结点的队列,包含指向队头和队尾的指针 `front` 和 `rear`,以及表示当前队列的成员数的变量 `len`。

2. **初始化队列:**
   - `Queue_Init` 函数用于初始化队列,创建一个带有头结点的链表。

3. **判断队列是否为空:**
   - `Queue_Empty` 函数通过判断队头和队尾指针是否相等来判断队列是否为空。

4. **获取队列有效数据节点个数:**
   - `Queue_Length` 函数用于获取队列中有效数据节点的个数,即队列的长度。

5. **创建队列:**
   - `Queue_Create` 函数用于通过用户输入创建队列,输入数据直到输入 `999`。

6. **新元素入队:**
   - `Queue_En` 函数用于将新元素入队,创建一个新的节点并添加到队尾。

7. **出队:**
   - `Queue_De` 函数用于将队头元素出队,删除队头节点。

8. **打印队列所有值:**
   - `Queue_Show` 函数用于打印队列中所有元素的值。

9. **主函数演示:**
   - 主函数演示了初始化队列、创建队列、入队、出队等操作,并输出相应的结果。

#include <stdio.h>
#include<stdlib.h>
typedef struct LNode {
  int data;
  struct LNode * next;
} LNode;
typedef struct {
    LNode * front, *rear; // 队头、队尾
    int len; // 当前队列的成员数
} LinkQueue;

// 初始化队列(带头结点)
bool Queue_Init (LinkQueue &Q) {
  Q.front = Q.rear = (LNode *)malloc(sizeof(LNode));
  Q.front->next = NULL;
  Q.len = 0;
  return true;
}

// 判断队列是否为空
bool Queue_Empty (LinkQueue Q) {
    return Q.front == Q.rear;
}

// 获取队列有效数据节点个数
int Queue_Length (LinkQueue Q) {
  return Q.len;
}

// 创建队列
LinkQueue Queue_Create(LinkQueue &Q) {
  LNode *pTemp; int x;
  scanf("%d", &x);
  while (x != 999) {
    pTemp = (LNode *)malloc(sizeof(LNode));
    pTemp->data = x;
    pTemp->next = NULL;
    Q.rear->next = pTemp;
    Q.rear = pTemp;
    Q.len += 1;
    scanf("%d", &x);
  }
  return Q;
}

// 新元素入队
bool Queue_En(LinkQueue &Q, int e) {
  LNode *pTemp = (LNode *)malloc(sizeof(LNode));
  pTemp->data = e;
  pTemp->next = NULL;
  Q.rear->next = pTemp;
  Q.rear = pTemp;
  Q.len += 1;
  return true;
}

// 出队
bool Queue_De (LinkQueue &Q, int &e) {
  if (Q.front == Q.rear) return false;
  LNode *p = Q.front->next; // 待删除结点
  Q.front->next = p->next;
  e = p->data;
  if (Q.rear == p)  // 删除的为最后一个结点
    Q.rear = Q.front;
  free(p);
  Q.len -= 1;
  return true;
}

// 打印队列所有值
void Queue_Show (LinkQueue Q) {
  LNode *node = Q.front->next;
  printf("队列值:");
  while (node != NULL) {
    printf("%d、", node->data);
    node = node->next;
  }
  printf("\n");
}

int main () {
  int i = -1;
  LinkQueue Q;
  Queue_Init(Q);
  printf("队列判空:%s\n", Queue_Empty(Q) ? "空" : "非空");

  Queue_Create(Q);
  Queue_Show(Q);
  printf("队列长度:%d\n\n", Queue_Length(Q));

  printf("入队列:0\n");
  Queue_En(Q, 0);
  Queue_Show(Q);
  printf("队列长度:%d\n\n", Queue_Length(Q));
  
  printf("入队列:99\n");
  Queue_En(Q, 99);
  Queue_Show(Q);
  printf("队列长度:%d\n\n", Queue_Length(Q));

  Queue_De(Q, i);
  printf("出队列值:%d\n", i);
  Queue_Show(Q);
  printf("队列长度:%d\n\n", Queue_Length(Q));
  
  Queue_De(Q, i);
  printf("出队列值:%d\n", i);
  Queue_Show(Q);
  printf("队列长度:%d\n\n", Queue_Length(Q));

  printf("队列判空:%s\n", Queue_Empty(Q) ? "空" : "非空");
  return 0;
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java可以使用以下代码来实现以头结点的循环链表表示队列: ```java public class Queue<T> { private Node<T> head; private int size; public Queue() { head = new Node<>(null); head.next = head; size = 0; } public void enqueue(T item) { Node<T> newNode = new Node<>(item); newNode.next = head.next; head.next = newNode; size++; } public T dequeue() { if (isEmpty()) { throw new NoSuchElementException("Queue is empty"); } Node<T> nodeToRemove = head.next; head.next = nodeToRemove.next; size--; return nodeToRemove.data; } public T peek() { if (isEmpty()) { throw new NoSuchElementException("Queue is empty"); } return head.next.data; } public boolean isEmpty() { return size == 0; } public int size() { return size; } private static class Node<T> { T data; Node<T> next; Node(T data) { this.data = data; this.next = null; } } } ``` 在这个实现中,`Queue`类有一个`head`属性,它是一个有`null`数据的空节点,用来作为循环链表头结点队列的大小由`size`属性记录。 `enqueue`方法将一个新节点插入到头结点之后,然后更新`size`。 `dequeue`方法从队列的头部删除一个节点,然后更新`size`并返回被删除节点的数据。如果队列为空,则抛出`NoSuchElementException`异常。 `peek`方法返回队列头部的节点的数据,但不删除该节点。如果队列为空,则抛出`NoSuchElementException`异常。 `isEmpty`方法检查队列是否为空。 `size`方法返回队列的大小。 `Node`是一个私有静态嵌套类,表示队列中的节点。每个节点都有一个`data`属性和一个指向下一个节点的`next`属性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值