数据结构队列的链式存储(c语⾔描述)
  队列是⼀种先进先出的线性表,在表头进⾏出队列,在表尾⼊队列,看了很多的队列的⽂章,发现每个⼈写的⽅式都不⼀样,但是最终都会遵从先进先出这个特性
1.定义结构体
typedef int ElemType;    //队列是⼀种先进先出线性表
typedef struct QNode{
ElemType data;
struct QNode *next;//指向下⼀个元素
}QNode,*QueuePtr;
typedef struct{
QueuePtr front,rear;//指向队头,队尾的指针
}QueuePointer;
2.初始化链队列:队头和队尾指针都指向头结点,但是他们的指针域都为空
void initQueue(QueuePointer *q)
{
q->front=q->rear=(QNode *)malloc(sizeof(QNode)); //指针指向的是同⼀块动态空间
if(!q->front)
{
printf("初始化空间失败\n");
}
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空
}
3.⼊队操作
void  push(QueuePointer *q,ElemType e)
{
QNode *currentNode=(QNode*)malloc(sizeof(QNode));//动态⽣成结点
if(!currentNode)
{
printf("申请空间失败\n");
}
currentNode->data=e;
currentNode->next=NULL;  //因为在队列尾部⼊队,队列尾部的指针域为空
q->rear->next=currentNode;  //和队尾连接起来
q->rear=currentNode;  //队尾指针重新指向队尾
}
4.出队列操作
//出队列操作
ElemType pop(QueuePointer *q,ElemType *e)
{
if(q->front==q->rear)
{
printf("队列为空,⽆法出队列\n");
return -1;
}
else if(q->front->next==q->rear)//队列中只有⼀个元素
{
*e=q->rear->data;
free(q->rear);    //释放空间,避免内存泄漏
q->rear=q->front; //头尾指针都指向头结点,
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空
return *e;
}
else//队列中的元素不⽌⼀个
{
*e=q->front->next->data;
QueuePtr temp=q->front->next;
q->front->next=temp->next;
free(temp);  //释放空间,避免内存泄漏
return *e;
}
}
5.销毁队列操作
void destroyQueue(QueuePointer *q)
{
QueuePtr temp,currentNode;
currentNode=q->front->next; //从第⼀个元素结点开始
while(currentNode)//当队列不为空时
{
temp=currentNode->next;
free(currentNode);
currentNode=temp;
}
q->rear=q->front; //头尾指针都指向头结点,
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空
}
6.输出当前队列
void printfQueue(QueuePointer q)
{
QueuePtr temp=q.front->next;//获取第⼀个有元素的结点
while(temp)
{
printf("%d  ",temp->data);
sizeof 指针temp=temp->next;
}
printf("\n");
}
所有的代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;    //队列是⼀种先进先出线性表
typedef struct QNode{
ElemType data;
struct QNode *next;//指向下⼀个元素
}QNode,*QueuePtr;
typedef struct{
QueuePtr front,rear;//指向队头,队尾的指针
}QueuePointer;
//初始化链式队列
void initQueue(QueuePointer *q)
{
q->front=q->rear=(QNode *)malloc(sizeof(QNode)); //指针指向的是同⼀块动态空间if(!q->front)
{
printf("初始化空间失败\n");
}
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空
}
//⼊队操作
void  push(QueuePointer *q,ElemType e)
{
QNode *currentNode=(QNode*)malloc(sizeof(QNode));//动态⽣成结点
if(!currentNode)
{
printf("申请空间失败\n");
}
currentNode->data=e;
currentNode->next=NULL;  //因为在队列尾部⼊队,队列尾部的指针域为空
q->rear->next=currentNode;  //和队尾连接起来
q->rear=currentNode;  //队尾指针重新指向队尾
}
//出队列操作
ElemType pop(QueuePointer *q,ElemType *e)
{
if(q->front==q->rear)
{
printf("队列为空,⽆法出队列\n");
return -1;
}
else if(q->front->next==q->rear)//队列中只有⼀个元素
{
*e=q->rear->data;
free(q->rear);    //释放空间,避免内存泄漏
q->rear=q->front; //头尾指针都指向头结点,
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空return *e;
}
else//队列中的元素不⽌⼀个
{
*e=q->front->next->data;
QueuePtr temp=q->front->next;
q->front->next=temp->next;
free(temp);  //释放空间,避免内存泄漏
return *e;
}
}
//销毁队列操作
void destroyQueue(QueuePointer *q)
{
QueuePtr temp,currentNode;
currentNode=q->front->next; //从第⼀个元素结点开始
while(currentNode)//当队列不为空时
{
temp=currentNode->next;
free(currentNode);
currentNode=temp;
}
q->rear=q->front; //头尾指针都指向头结点,
q->front->next=q->rear->next=NULL;//头尾指针都指向头结点,但是指针域为空}
//输出当前队列
void printfQueue(QueuePointer q)
{
QueuePtr temp=q.front->next;//获取第⼀个有元素的结点
while(temp)
{
printf("%d  ",temp->data);
temp=temp->next;
}
printf("\n");
}
int main()
{
QueuePointer q;//声明结构体对象
int number;//指令
int e;    // 数据
initQueue(&q);//初始化
printf("结束操作----------0\n");
printf("⼊队列操作----------1\n");
printf("出队列操作----------2\n");
printf("销毁队列操作----------3\n");
printf("打印操作----------4\n");
printf("请输⼊你的指令:");
scanf("%d",&number);
while(number!=0)
{
switch(number)
{
case1:
printf("请输⼊要⼊队列的值:");
scanf("%d",&e);
push(&q,e);
break;
case2:
e=pop(&q,&e);
printf("出队列的值为:%d\n",e);
break;
case3:
destroyQueue(&q);
printf("队列已销毁");
case4:
printfQueue(q);
break;
default:
printf("你输⼊的指令不正确\n");
}
printf("你的指令为:");
scanf("%d",&number);
}
return0;
}
  队列的链式操作就是这样了,记录⽇常。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。