接下来我将详细讲解“C语言实现链队列”的完整攻略。
什么是链队列
链队列是一种基于链表的队列实现,其底层数据结构为一个链表。相比于数组实现的队列,链队列具有动态分配内存空间的优势。链队列的队首与队尾分别指向链表的首尾节点,数据元素按顺序排列,后进先出。
实现链队列的步骤
1. 定义队列结构体
首先,需要定义队列结构体,包括队列的基本属性和操作方法:
// 定义链队列节点结构体
typedef struct node {
int data; // 节点的数据
struct node *next; // 下一个节点指针
} Node;
// 定义链队列结构体
typedef struct queue {
Node *front; // 队首指针
Node *rear; // 队尾指针
int size; // 队列大小
} Queue;
// 队列的初始化操作,返回一个新的队列
Queue *initQueue();
// 入队操作,在队列末尾插入一个元素
void enqueue(Queue *queue, int data);
// 出队操作,移除队首的元素
int dequeue(Queue *queue);
// 获取队首元素的值
int peek(Queue *queue);
// 判断队列是否为空
int isEmpty(Queue *queue);
// 获取队列的大小
int size(Queue *queue);
// 打印队列中的所有元素
void printQueue(Queue *queue);
2. 定义队列的初始化操作
队列的初始化操作,也称为队列的创建操作,需要初始化队列结构体的各个属性。
Queue *initQueue() {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->front = NULL;
queue->rear = NULL;
queue->size = 0;
return queue;
}
3. 定义入队操作
入队操作会在队列的末尾插入一个元素,需要考虑队列是否为空的情况。
void enqueue(Queue *queue, int data) {
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if(queue->rear==NULL) {
queue->front = node;
} else {
queue->rear->next = node;
}
queue->rear = node;
queue->size++;
}
4. 定义出队操作
出队操作会移除队列的队首元素,同样需要考虑队列为空的情况。
int dequeue(Queue *queue) {
if(queue->front==NULL) {
printf("Error: queue is empty.\n");
return -1;
}
int data = queue->front->data;
Node *node = queue->front;
queue->front = queue->front->next;
if(queue->front==NULL) {
queue->rear = NULL;
}
free(node);
queue->size--;
return data;
}
5. 定义获取队首元素的值
获取队首元素的值的方法很简单,只需要返回队列的队首元素即可。
int peek(Queue *queue) {
if(queue->front==NULL) {
printf("Error: queue is empty.\n");
return -1;
}
return queue->front->data;
}
6. 定义判断队列是否为空的操作
判断队列是否为空的方法很简单,只需要判断队列的队首元素是否为空即可。
int isEmpty(Queue *queue) {
return queue->front==NULL;
}
7. 定义获取队列大小的方法
获取队列大小很简单,只需要返回队列的size属性即可。
int size(Queue *queue) {
return queue->size;
}
8. 定义打印队列中所有元素的方法
打印队列中所有元素的方法需要遍历整个链表,依次输出每个节点的值。
void printQueue(Queue *queue) {
printf("queue: ");
Node *node = queue->front;
while(node!=NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
示例说明
下面是两个示例说明,展示如何使用该链队列实现队列的功能。
示例1:使用该链队列实现队列的功能
Queue *queue = initQueue(); // 初始化队列
enqueue(queue, 1); // 入队:1
enqueue(queue, 2); // 入队:2
enqueue(queue, 3); // 入队:3
printQueue(queue); // 输出队列:queue: 1 2 3
printf("queue front value: %d\n", peek(queue)); // 获取队首元素的值:queue front value: 1
printf("queue size: %d\n", size(queue)); // 获取队列大小:queue size: 3
printf("dequeue: %d\n", dequeue(queue)); // 出队:1
printf("dequeue: %d\n", dequeue(queue)); // 出队:2
printQueue(queue); // 输出队列:queue: 3
printf("queue size: %d\n", size(queue)); // 获取队列大小:queue size: 1
示例2:使用该链队列解决约瑟夫问题
int n = 10; // 环的大小
int m = 3; // 每m个人出环
Queue *queue = initQueue(); // 初始化队列
for(int i=1; i<=n; i++) {
enqueue(queue, i); // 入队
}
printf("Josephus sequence:");
while(!isEmpty(queue)) {
for(int i=1; i<=m; i++) {
int data = dequeue(queue);
if(i==m) {
printf(" %d", data);
} else {
enqueue(queue, data);
}
}
}
printf("\n");
以上就是完整的“C语言实现链队列”的攻略。希望可以帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现链队列 - Python技术站