C语言队列排序如何自己输入
使用数组实现队列、使用链表实现队列、插入排序、选择排序、冒泡排序
要在C语言中实现队列排序并且允许用户自行输入,主要可以通过两种方式实现队列:使用数组和使用链表。然后,我们可以选择多种排序算法来对队列进行排序,比如插入排序、选择排序和冒泡排序。本文将详细介绍如何通过这两种方式实现队列,并使用上述排序算法对其进行排序。
一、使用数组实现队列
1、定义队列结构
在C语言中,使用数组实现队列是最常见且简单的方法之一。我们首先需要定义一个结构体来表示队列,其中包含一个数组来存储元素以及一些辅助变量来跟踪队列的头和尾。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int items[MAX_SIZE];
int front;
int rear;
} Queue;
2、初始化队列
接下来,我们需要一个函数来初始化队列,将队列的头和尾设置为-1,表示队列为空。
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
3、检查队列是否为空和是否已满
我们还需要一些辅助函数来检查队列是否为空或已满。
int isEmpty(Queue *q) {
return q->front == -1;
}
int isFull(Queue *q) {
return q->rear == MAX_SIZE - 1;
}
4、入队和出队操作
接下来,我们实现入队和出队操作,以便用户可以向队列添加和移除元素。
void enqueue(Queue *q, int value) {
if (isFull(q)) {
printf("Queue is fulln");
return;
}
if (isEmpty(q)) {
q->front = 0;
}
q->rear++;
q->items[q->rear] = value;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("Queue is emptyn");
return -1;
}
int item = q->items[q->front];
q->front++;
if (q->front > q->rear) {
q->front = q->rear = -1;
}
return item;
}
5、插入排序
为了对队列进行排序,我们可以使用插入排序算法。插入排序是一种简单且直观的排序算法,适用于小规模数据的排序。
void insertionSort(Queue *q) {
for (int i = q->front + 1; i <= q->rear; i++) {
int key = q->items[i];
int j = i - 1;
while (j >= q->front && q->items[j] > key) {
q->items[j + 1] = q->items[j];
j--;
}
q->items[j + 1] = key;
}
}
6、用户输入
我们还需要一个函数来允许用户输入队列的元素。
void inputQueue(Queue *q) {
int n, value;
printf("Enter the number of elements: ");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("Enter element %d: ", i + 1);
scanf("%d", &value);
enqueue(q, value);
}
}
7、主函数
最后,我们编写主函数来测试上述功能。
int main() {
Queue q;
initQueue(&q);
inputQueue(&q);
printf("Queue before sorting:n");
for (int i = q.front; i <= q.rear; i++) {
printf("%d ", q.items[i]);
}
printf("n");
insertionSort(&q);
printf("Queue after sorting:n");
for (int i = q.front; i <= q.rear; i++) {
printf("%d ", q.items[i]);
}
printf("n");
return 0;
}
二、使用链表实现队列
1、定义队列结构
使用链表实现队列可以更灵活地处理动态数据。我们首先定义一个节点结构和队列结构。
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct {
Node *front;
Node *rear;
} Queue;
2、初始化队列
接下来,我们需要一个函数来初始化链表队列。
void initQueue(Queue *q) {
q->front = q->rear = NULL;
}
3、检查队列是否为空
我们需要一个函数来检查队列是否为空。
int isEmpty(Queue *q) {
return q->front == NULL;
}
4、入队和出队操作
接下来,我们实现链表队列的入队和出队操作。
void enqueue(Queue *q, int value) {
Node *newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation errorn");
return;
}
newNode->data = value;
newNode->next = NULL;
if (isEmpty(q)) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("Queue is emptyn");
return -1;
}
Node *temp = q->front;
int item = temp->data;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
return item;
}
5、插入排序
对于链表队列,我们可以使用插入排序来对其进行排序。
void insertionSort(Queue *q) {
if (isEmpty(q) || q->front == q->rear) {
return;
}
Node *sorted = NULL;
Node *current = q->front;
while (current != NULL) {
Node *next = current->next;
if (sorted == NULL || sorted->data >= current->data) {
current->next = sorted;
sorted = current;
} else {
Node *temp = sorted;
while (temp->next != NULL && temp->next->data < current->data) {
temp = temp->next;
}
current->next = temp->next;
temp->next = current;
}
current = next;
}
q->front = sorted;
}
6、用户输入
我们需要一个函数来允许用户输入链表队列的元素。
void inputQueue(Queue *q) {
int n, value;
printf("Enter the number of elements: ");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("Enter element %d: ", i + 1);
scanf("%d", &value);
enqueue(q, value);
}
}
7、主函数
最后,我们编写主函数来测试上述功能。
int main() {
Queue q;
initQueue(&q);
inputQueue(&q);
printf("Queue before sorting:n");
Node *temp = q.front;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("n");
insertionSort(&q);
printf("Queue after sorting:n");
temp = q.front;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("n");
return 0;
}
三、选择排序
选择排序是一种简单的排序算法,适用于小规模数据的排序。我们可以将其应用于数组和链表队列。
1、数组队列的选择排序
void selectionSort(Queue *q) {
for (int i = q->front; i <= q->rear - 1; i++) {
int minIndex = i;
for (int j = i + 1; j <= q->rear; j++) {
if (q->items[j] < q->items[minIndex]) {
minIndex = j;
}
}
int temp = q->items[minIndex];
q->items[minIndex] = q->items[i];
q->items[i] = temp;
}
}
2、链表队列的选择排序
void selectionSort(Queue *q) {
if (isEmpty(q) || q->front == q->rear) {
return;
}
Node *start = q->front;
while (start != NULL) {
Node *minNode = start;
Node *current = start->next;
while (current != NULL) {
if (current->data < minNode->data) {
minNode = current;
}
current = current->next;
}
int temp = start->data;
start->data = minNode->data;
minNode->data = temp;
start = start->next;
}
}
四、冒泡排序
冒泡排序是一种简单的排序算法,适用于小规模数据的排序。我们可以将其应用于数组和链表队列。
1、数组队列的冒泡排序
void bubbleSort(Queue *q) {
for (int i = q->front; i < q->rear; i++) {
for (int j = q->front; j < q->rear - (i - q->front); j++) {
if (q->items[j] > q->items[j + 1]) {
int temp = q->items[j];
q->items[j] = q->items[j + 1];
q->items[j + 1] = temp;
}
}
}
}
2、链表队列的冒泡排序
void bubbleSort(Queue *q) {
if (isEmpty(q) || q->front == q->rear) {
return;
}
int swapped;
Node *ptr1;
Node *lptr = NULL;
do {
swapped = 0;
ptr1 = q->front;
while (ptr1->next != lptr) {
if (ptr1->data > ptr1->next->data) {
int temp = ptr1->data;
ptr1->data = ptr1->next->data;
ptr1->next->data = temp;
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
通过上述步骤,我们可以在C语言中实现队列排序,并允许用户自行输入数据。无论是使用数组还是链表,我们都可以选择适合的排序算法来对队列进行排序。通过这些示例代码,您可以更好地理解如何在C语言中实现队列和排序操作,并根据实际需求进行调整和优化。
相关问答FAQs:
1. 如何在C语言中实现队列排序?
在C语言中,可以使用数组或链表来实现队列。首先,将需要排序的元素依次入队,然后利用排序算法对队列中的元素进行排序,最后按照出队的顺序输出已排序的元素。
2. 如何在C语言中实现自己输入队列排序?
要实现自己输入的队列排序,可以先定义一个队列数据结构,包括队列的大小和元素数组。然后,通过用户输入的方式逐个将元素入队,并在入队时进行排序。最后,按照出队的顺序输出已排序的元素。
3. 如何利用C语言编写程序实现自己输入的队列排序?
首先,定义一个队列数据结构,包括队列的大小和元素数组。然后,在主函数中提示用户输入队列的大小和元素,并逐个将元素入队。在入队时,可以使用插入排序等算法对队列中的元素进行排序。最后,按照出队的顺序输出已排序的元素。这样,就实现了自己输入的队列排序。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1022466