数据结构-链式队列(C语言实现)
1. 导入头文件
编写代码过程中,涉及动态内存分配等常用的函数,需要引入如下头文件
#include<stdio.h>
#include<stdlib.h>
2. 结构体定义
// 链表节点的结构定义
typedef struct Node
{
int data;
struct Node * next;
} NODE, *PNODE;
// 队列的结构定义
typedef struct Queue
{
PNODE pFront;
PNODE pTail;
} QUEUE, *PQUEUE;
3. 函数声明
void init(PQUEUE pQueue); // 初始化
void show(PQUEUE pQueue); // 列出所有元素
int isEmpty(PQUEUE pQueue); // 是否为空
void enQueue(PQUEUE pQueue, int val); // 入队
void deQueue(PQUEUE pQueue, int *val); // 出队
4. 队列初始化
队列初始化时将头和尾指向同一位置
void init(PQUEUE pQ)
{
pQ->pFront = (PNODE)malloc(sizeof(NODE));
if (NULL == pQ->pFront)
{
printf("内存分配失败");
exit(-1);
} else
{
pQ->pTail = pQ->pFront;
pQ->pTail->next = NULL;
}
}
5. 判断队列是否为空
int isEmpty(PQUEUE pQ)
{
if (pQ->pFront == pQ->pTail) // 和初始化时相同则为空
{
return 1;
}
return 0;
}
6. 入队操作
入队操作,当有元素入队时,要移动尾指针 pTail ,pTail 始终指向最后一个元素。
void enQueue(PQUEUE pQ, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL)
{
printf("内存分配失败");
exit(-1);
}
pNew->data = val;
pQ->pTail->next = pNew; // 注意链表的指向
pQ->pTail = pNew;
}
6. 出队操作
出队操作和链表删除元素操作一致。
void deQueue(PQUEUE pQ, int *val)
{
if (isEmpty(pQ)){
printf("队列为空");
return;
} else
{
PNODE q = pQ->pFront->next;
*val = q->data;
pQ->pFront->next=q->next;
free(q);
q=NULL;
}
}
7. 列出队列所有元素
void show(PQUEUE pQ)
{
if (isEmpty(pQ))
{
printf("队列为空\n");
} else
{
PNODE p = pQ->pFront->next;
while (p)
{
printf("%d,", p->data);
p=p->next;
}
printf("\n");
}
}
8. main 函数
int main()
{
int val;
QUEUE q;
init(&q);
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
enQueue(&q, 4);
show(&q);
deQueue(&q, &val);
deQueue(&q, &val);
show(&q);
return 0;
}
浙公网安备 33010602011771号