C语言中创建一个队列并给它赋值,以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针)
时间: 2024-11-22 16:36:18 浏览: 26
在C语言中,我们可以使用链表数据结构来实现一个队列,因为链表的插入和删除操作比较高效。这里我们使用带头节点(即第一个元素的前一个元素被称为头结点)的单向循环链表作为队列的数据结构。由于只需要一个指针指向队尾,所以我们将维护一个`tail`指针。
首先,我们需要定义队列的结构体:
```c
typedef struct Node {
int data; // 存储数据
struct Node* next; // 指向下一个节点
} QueueNode;
// 队列结构体,包含头结点和尾指针
typedef struct Queue {
QueueNode* head; // 空头结点,实际上头结点.next = tail
QueueNode* tail;
} Queue;
```
接下来,我们初始化队列(如果队列为空,`head`和`tail`都为NULL),并添加元素到队尾:
```c
void initQueue(Queue* q) {
q->head = q->tail = NULL;
}
// 添加元素到队尾
void enqueue(Queue* q, int value) {
if (q->tail == NULL) {
// 如果队列为空,创建一个新的头结点
QueueNode* newNode = malloc(sizeof(QueueNode));
newNode->data = value;
newNode->next = q->tail;
q->tail = newNode;
q->head = newNode; // 因为是循环链表,头也是尾
} else {
// 非空队列,新建节点并连接到尾部
QueueNode* newNode = malloc(sizeof(QueueNode));
newNode->data = value;
newNode->next = q->tail->next; // 新结点的next指向当前尾结点的下一个位置
q->tail->next = newNode; // 更新尾结点的next
q->tail = newNode; // 尾结点更新为新加入的节点
}
}
```
为了演示这个过程,你可以像下面这样使用:
```c
int main() {
Queue queue;
initQueue(&queue);
enqueue(&queue, 1);
enqueue(&queue, 2);
enqueue(&queue, 3); // ... 其他元素
// ... 使用队列的操作
return 0;
}
```
阅读全文