文章目录
- 1 链队定义
- 2 链队基本操作
- 3 代码实现
1 链队定义
队列的链式存储结构简称为链队列,它是限制仅在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指向链表上的最后一个结点。
typedef int ElemType;
typedef struct queue {ElemType data;struct queue *next;
} *Queue;
typedef struct linkQueue {Queue front;Queue rear;
} *LinkQueue;
2 链队基本操作
判断队列是否为空
int IsEmpty(LinkQueue Q)
{return Q->front == Q->rear;
}
入队
第一个元素进入一个空队后,front和rear都指向这个元素,后继的元素陆续进队,队尾入,rear指针始终指向最后一个进队的元素。
void EnQueue(LinkQueue Q, ElemType e)
{Queue q = (Queue)malloc(sizeof(struct queue));q->data = e;q->next = NULL;Q->rear->next = q;Q->rear = q;
}
出队
队头出,首先进行出队判空的检查
void DeQueue(LinkQueue Q, ElemType *e)
{if (IsEmpty(Q)) {return;}Queue p = Q->front->next;*e = p->data;Q->front->next = p->next;if (Q->rear == p) {Q->rear = Q->front;}free(p);
}
3 代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>typedef int ElemType;
typedef struct queue {ElemType data;struct queue *next;
} *Queue;typedef struct linkQueue {Queue front;Queue rear;
} *LinkQueue;LinkQueue InitQueue(void)
{LinkQueue Q = (LinkQueue)malloc(sizeof(struct linkQueue));Q->rear = Q->front = (Queue)malloc(sizeof(struct queue));Q->front->next = NULL;return Q;
}int IsEmpty(LinkQueue Q)
{return Q->front == Q->rear;
}void EnQueue(LinkQueue Q, ElemType e)
{Queue q = (Queue)malloc(sizeof(struct queue));q->data = e;q->next = NULL;Q->rear->next = q;Q->rear = q;
}void DeQueue(LinkQueue Q, ElemType *e)
{if (IsEmpty(Q)) {return;}Queue p = Q->front->next;*e = p->data;Q->front->next = p->next;if (Q->rear == p) {Q->rear = Q->front;}free(p);
}int main(void)
{LinkQueue Q = InitQueue();ElemType e;scanf("%d", &e);EnQueue(Q, e);DeQueue(Q, &e);printf("%d", e);
}
运行结果: