队列
先进先出,头部添加,尾部删除
typedef struct Node
{
int nVal;
struct Node* pNext;
}Queue;
队列的添加
构造一个结点,当头结点不为空时,让尾结点的pNext指向pTemp,把新结点插入链表成为最后一个元素。
当头结点为空时,说明该链表为空,直接让头结点等于新结点。
最后再让新结点成为尾结点,把新结点赋给尾结点
void Push(Queue** ppHead, Queue** ppEnd, int nVal)
{
Queue* pTemp = malloc(sizeof(Queue));
pTemp->nVal = nVal;
pTemp->pNext = NULL;
if (*ppHead == NULL)
{
*ppHead = pTemp;
}
else
{
(*ppEnd)->pNext = pTemp;
}
*ppEnd = pTemp;
}
队列的删除
首先判断队列是否为空,如果为空就不进行操作输出-1.
队列不为空时,先创建一个中间节点,把要删除的节点(头结点)赋给中间节点,再把头结点的下一个结点赋给头结点,这时原来头结点的内容就被转移到了中间结点,再把中间结点中包含的值提取出来用来输出,证明删除的是哪个结点,然后再把中间结点进行释放,free(pDel);,释放过后要把pDel结点赋空值,还要判断头结点是否为空,如果头结点为空,则说明该队列不含元素,要把尾结点也进行赋空值,最后再返回提取的值n,说明删除的是哪个结点。
测试队列的主函数和头文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
Queue* pHead = NULL;
Queue* pEnd = NULL;
Push(&pHead, &pEnd, 1);
Push(&pHead, &pEnd, 2);
Push(&pHead, &pEnd, 3);
printf("%d\n", Pop(&pHead, &pEnd));
printf("%d\n", Pop(&pHead, &pEnd));
printf("%d\n", Pop(&pHead, &pEnd));
return 0;
}