#include "stdio.h"
#include "stdlib.h"
// 数据域
typedef struct LData {
char c; // 常数
} LData;
// 单链表
typedef struct Queue {
LData data; //数据域
struct Queue *next;
} Queue;
typedef struct Snode {
Queue *front;
Queue *rear;
} Snode;
// 初始化队列
Snode *InitStack() {
Queue *q;
Snode *s;
s = (Snode *) malloc(sizeof(Snode));
q = (Queue *) malloc(sizeof(Queue)); // 申请头结点作为队头的前一个节点,方便操作
q->data.c = -1; // 头结点
q->next = NULL; //头结点下一个指针域置为空
s->front = s->rear = q; // 初识化队列的队头、队尾指针
return s;
}
//入队 队头出,队尾入
void pushQ(Snode *s, char e) { // 头结点为栈顶
Queue *p;
p = (Queue *) malloc(sizeof(Queue));
if(p == NULL){
printf("没有成功申请节点\n");
}
p->data.c = e;
p->next = NULL; // 新节点的下一个指针域置为空,因为他是最后一个节点
s->rear->next = p; // 新节点放在队尾
s->rear = p; // 将新节点地址给队尾指针
}
// 出队
void popQ(Snode *s) {
if (s->front == s->rear) {
printf("队列中没有元素\n");
return;
}
Queue *p;
p = s->front->next; // 队头元素给p,进行出队操作
printf("出队:%c\n", p->data.c);
if (p == s->rear) { // 最后一个元素
s->rear = s->front;
return;
}
s->front->next = p->next;
free(p);
}
// 清空队列
void clearQ(Snode *s) {
if (s->front == s->rear) {
printf("队列中没有元素\n");
return;
}
Queue *p;
p = NULL;
while (s->front != s->rear) {
p = s->front->next;
s->front = p->next;
free(p);
}
s->rear = s->front;
}
// 销毁队列
void destroyQ(Snode *s) {
if (s == NULL) {
printf("队列不存在\n");
return;
}
Queue *p;
p = NULL;
while (s->front != s->rear) {
p = s->front->next;
s->front = p->next;
free(p);
}
s->rear = s->front = NULL;
}
int main() {
//测试
Snode *q;
q = InitStack();
pushQ(q, 'a');
pushQ(q, 'i');
pushQ(q, 'g');
pushQ(q, 'e');
// clearQ(q);
// destroyQ(q);
popQ(q);
popQ(q);
popQ(q);
popQ(q);
popQ(q);
return 0;
}
队列-链表实现队列的初始化,入队,出队,清空,销毁操作
最新推荐文章于 2023-04-22 21:56:45 发布