用c语言实现链队列,判空,入队,出队,输出,把输入的数存入n。先判n为何值。否则判队列是否为空;若为空则执行队列插入操作。若队列不为空,则与队头结点比较。比较相等,则执行队列的删除操作;否则执行插入操作。这个过程重复进行,直到输入0时结束 。输入一个自然数n,与队头结点数据配对。如果相等,则删除队头结点;如果不相等或队列为空,则把n插入队列。
时间: 2023-06-13 22:07:36 浏览: 81
好的,以下是用C语言实现链队列的代码,实现了判空,入队,出队,输出等操作,并按照要求实现了上述问题的解决方案:
```c
#include<stdio.h>
#include<stdlib.h>
// 定义链队列结构体
typedef struct node {
int data; // 数据域
struct node *next; // 指针域
} Node, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
// 初始化队列
void InitQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr) malloc(sizeof(Node));
if (!Q->front) exit(-1); // 内存分配失败
Q->front->next = NULL;
}
// 判断队列是否为空
int QueueEmpty(LinkQueue *Q) {
if (Q->front == Q->rear) return 1;
else return 0;
}
// 入队
void EnQueue(LinkQueue *Q, int e) {
QueuePtr p = (QueuePtr) malloc(sizeof(Node));
if (!p) exit(-1); // 内存分配失败
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
// 出队
int DeQueue(LinkQueue *Q) {
if (Q->front == Q->rear) exit(-1); // 队列为空
QueuePtr p = Q->front->next;
int e = p->data;
Q->front->next = p->next;
if (Q->rear == p) Q->rear = Q->front; // 如果队列只有一个元素,删除后队头和队尾指针都指向头结点
free(p);
return e;
}
// 输出队列中的元素
void PrintQueue(LinkQueue *Q) {
if (QueueEmpty(Q)) printf("队列为空!\n");
else {
QueuePtr p = Q->front->next;
printf("队列中的元素为:");
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main() {
LinkQueue Q;
int n;
InitQueue(&Q); // 初始化队列
printf("请输入自然数n:");
scanf("%d", &n);
while (n != 0) {
if (QueueEmpty(&Q)) EnQueue(&Q, n); // 如果队列为空,则直接插入
else {
if (Q.front->next->data == n) DeQueue(&Q); // 如果队头元素和n相等,则删除队头元素
else EnQueue(&Q, n); // 如果队头元素和n不相等,则插入n
}
printf("请输入自然数n:");
scanf("%d", &n);
}
printf("程序结束!\n");
PrintQueue(&Q); // 输出队列中的元素
return 0;
}
```
在主函数中,我们先初始化了队列,然后输入自然数n,进入while循环。在循环中,我们先判断n是否为0,如果不为0,则按照要求进行操作,如果队列为空,则直接插入,否则进行比较,相等则删除队头元素,不相等则插入n。最后循环结束后,输出队列中的元素即可。
希望能够帮到你!
阅读全文