用 C语言数据结构编写 用队列解决舞伴问题,采用顺序或者链式结构(简易版本)
时间: 2024-09-29 12:04:25 浏览: 38
数据结构,用C语言实现顺序栈和链式队列的源码
在C语言中,我们可以利用队列数据结构来解决舞伴问题,也称为“约会问题”或“旋转门问题”。这个问题通常涉及将n个人排成一队,每次从队列的一端取出两个人作为一对舞伴,然后让他们跳舞,最后再将他们放回队尾。这里我们演示如何用两种简单的方式——顺序(数组)和链式(链表)数据结构来实现。
**顺序队列(基于数组)解决方案:**
```c
#include <stdio.h>
#define MAX_PARTNERS 10
typedef struct {
int partners[MAX_PARTNERS];
int front; // 队头指针
int rear; // 队尾指针
} Queue;
void enqueue(Queue *q, int partner) {
if (q->rear == q->front) {
printf("Queue is full.\n");
return;
}
q->partners[q->rear] = partner;
q->rear = (q->rear + 1) % MAX_PARTNERS;
}
int dequeue(Queue *q) {
if (q->front == q->rear) {
printf("Queue is empty.\n");
return -1;
}
int partner = q->partners[q->front];
q->front = (q->front + 1) % MAX_PARTNERS;
return partner;
}
// 主函数
int main() {
Queue danceQueue;
for (int i = 1; i <= MAX_PARTNERS; ++i) {
enqueue(&danceQueue, i);
}
while (!queueEmpty(&danceQueue)) {
int partnerA = dequeue(&danceQueue);
int partnerB = dequeue(&danceQueue);
printf("Dancing pair: %d and %d\n", partnerA, partnerB);
}
return 0;
}
```
**链式队列(基于链表)解决方案:**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct Queue {
Node* front;
Node* rear;
} Queue;
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;
}
}
int dequeue(Queue *q) {
if (q->front == NULL) {
printf("Queue is empty.\n");
return -1;
}
int data = q->front->data;
Node* temp = q->front;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
return data;
}
// ... 其他部分与顺序队列类似 ...
```
在这个例子中,我们首先初始化队列,然后不断地从队列头部取出两个元素组成一对舞伴,直到队列为空。两种方法各有优劣,顺序队列空间效率较高但插入和删除操作受限于数组大小;链式队列动态扩容,插入和删除操作更方便,但需要额外的内存开销。
阅读全文