您的位置:首页 > 理论基础 > 数据结构算法

数据结构之队列(二)——链队列

2016-04-11 18:07 429 查看
链队列采用带头结点的链表,队头指针始终指向头结点队尾指针始终指向最后一个元素

当队列为空时:队头指针和队尾指针均指向头结点

链队列不会满!!!

链队列的定义:

1.定义一种结点结构体:指针域指向下一个结点,数据域存储数据

2.定义链队列结构体:分别存储两个结点指针,队头指针和队尾指针

typedef char DataType;
typedef struct Node{
DataType data;
struct Node* next;
}LinkQueueNode;
typedef struct Queue{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;


  

链队列的初始化

队头指针和队尾指针相等且均为空

bool InitQueue(LinkQueue* Q)
{
Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->front->next=NULL;
Q->rear=Q->front;
return true;
}
else
{
return false;
}
}


  

入队:

记得队尾的元素的next域为空

bool EnterQueue(LinkQueue* Q,DataType x)
{
LinkQueueNode *p;
p=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(p!=NULL)
{
p->data=x;
Q->rear->next=p;
p->next=NULL;//注意要赋空
Q->rear=p;
return true;
}
else
return false;
}


  出对

1.删除操作之间要判断是否为空

2.要根据删除操作之后是否为空来决定队尾指针是否等于队头指针

bool DelteQueue(LinkQueue* Q,DataType* x)
{
LinkQueueNode* p;
//记住:删除操作之前要记得判断是否为空
if(Q->front==Q->rear)
return false;
else
{
p=Q->front->next;
*x=p->data;
Q->front->next=p->next;
if(p==Q->rear)
Q->rear=Q->front;

free(p);
return true;
}
}


  

可以这样理解:1.判断是否为空

       2.使p=front-》next

       3.赋值给x

       4.使p出对:

Q->front->next=p->next;
       


       5.判断p出对之后是否为空

          若为空:队尾指针等于队头指针

          若不为空:不做处理

      6.释放p
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: