链队列的简单操作(入队,出队,输出队元素等)
2017-10-27 22:59
543 查看
定义一个节点,里面包含元素类型,指向下一个节点的指针。然后定义一个结构体,里面两个指针,指向队头和队尾
typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;
typedef struct {
Queue front;
Queue rear;
}LinkQueue;
入队操作要注意别动指向队头的front指针,如果是q->front->next = p那每次就会插到队头。而队列是队头出,队尾进。也不要忘了新节点p->next = NULL;
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
出队别忘了最后的判断是否头尾指向了一个节点
输出队列元素,首先判断是否为空。不要动队头和队尾指针,否则你移动了了个指针就破坏了队列结构,你将队头指针的地址告诉节点指针,让节点进行遍历,从而进行保护
void print(LinkQueue * q)
{
QNode * p = q->front->next;
if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}
具体实现如下
typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;
typedef struct {
Queue front;
Queue rear;
}LinkQueue;
入队操作要注意别动指向队头的front指针,如果是q->front->next = p那每次就会插到队头。而队列是队头出,队尾进。也不要忘了新节点p->next = NULL;
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
出队别忘了最后的判断是否头尾指向了一个节点
void DeQueue(LinkQueue * q) { QNode * p; if (IsEmpty(&q)) { printf("空列\n"); } p = q->front->next; q->front->next = p->next; if (q->rear == p) q->rear = q->front; free(p); printf("出队成功\n"); }
输出队列元素,首先判断是否为空。不要动队头和队尾指针,否则你移动了了个指针就破坏了队列结构,你将队头指针的地址告诉节点指针,让节点进行遍历,从而进行保护
void print(LinkQueue * q)
{
QNode * p = q->front->next;
if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}
具体实现如下
#include<stdio.h>
#include<stdlib.h>
typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;
typedef struct {
Queue front;
Queue rear;
}LinkQueue;
void InitialQueue(LinkQueue * q)
{
q->front = q->rear = (Queue)malloc(sizeof(QNode));
if (!q->front) {
printf("无内存空间可分配\n");
}
q->front->next = NULL;
printf("初始化成功\n");
}
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
int IsEmpty(LinkQueue * q)
{
return (q->front== q->rear)?1:0;
}
void DeQueue(LinkQueue * q) { QNode * p; if (IsEmpty(&q)) { printf("空列\n"); } p = q->front->next; q->front->next = p->next; if (q->rear == p) q->rear = q->front; free(p); printf("出队成功\n"); }
void DesQueue(LinkQueue * q)
{
while (q->front) {
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
printf("销毁成功\n");
exit(1);
}
void print(LinkQueue * q)
{
QNode * p = q->front->next;
if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
LinkQueue queue;
int num, flag;
InitialQueue(&queue);
while (scanf("%d", &num)) {
EnQueue(&queue, num);
}
getchar();
printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
while (scanf("%d", &flag) && flag != 6) {
switch (flag) {
case 1: printf("输入入队元素:");scanf("%d", &num);EnQueue(&queue, num);break;
case 2: DeQueue(&queue);break;
case 3: printf("%s\n\n", IsEmpty(&queue)==1?"空队":"非空队");break;
case 4: print(&queue);break;
case 5: DesQueue(&queue);break;
default: printf("请输入合法操作!\n\n");break;
}
printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
}
return 0;
}
相关文章推荐
- 顺序队列的创建、初始化、判断空、入队、出队、读取队头元素、置空、求队长操作
- 循环队列和链式队列的结构及其基本操作(入队、出队、取队头、查看对内元素)
- C++实现普通队列,循环队列的基本操作(初始化,入队,出队,获取队列首元素等)
- 编程实现顺序队列的入队操作和出队操作,并将出队结果输出
- 顺序循环队列基本操作(入队,出队,清空,销毁,历遍)
- 双向链表实现队列的 入队、出队、查找元素
- 循环队列的定义、入队、出队等操作 C++代码实现
- 队列的入队出队操作
- 链式队列操作,初始化,入队,出队
- 编程实现队列的入队/出队操作
- 队列操作--出队入队
- HW输入字符串长度,字符串,计数m。从前往后计数,当数到m个元素时,m个元素出列,同时将该元素赋值给m,然后从下一个数计数循环,直到所有数字都出列,给定的数全部为大于0的数字。输出出队队列。
- 编程实现队列的入队/出队操作
- 循环队列的初始化、入队、出队等基本操作
- 循环队列的操作(初始化,入队,出对,销毁,输出)
- queue队列容器入队,出队,读取队首元素,队尾元素,判断是否为空
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- (10.15)[转]C++学习(队列操作,入队,出队)
- 【数据结构】队列的出队和入队操作
- 队列 入队,插入,出队,是否队空,队元元素,清空,打印