数据结构论坛

首页 » 分类 » 分类 » 数据结构图解链表,用链表实现队列c语言
TUhjnbcbe - 2024/8/14 16:56:00

队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的实现

队列的实现,和我们上节介绍的栈一样,都可以由数组和链表实现,这里我们使用连链表来实现队列,下面为队列定义的结构体:

typedefintElemtype;typedefstructLNode{  structLNode*next;  Elemtypedata;}LNode;typedefstructqueue{  LNode*front;  LNode*rear;  intlen;}queue;

这里可以给栈定义一系列基本操作:

queue*InitQueue()//初始化一个队列voidEnQueue(queue*q,Elemtypedata)//入队ElemtypeDeQueue(queue*q)//出队

初始化一个队列

queue*InitQueue(){  queue*q=calloc(1,sizeof(queue));  assert(q);  returnq;}

入队、出队操作很简单,我们只要操作队列结构体中的front以及rear俩个指针就可以实现入队以及出队

入队

这里我们只要将新结点赋值给rear的next即可,上代码

voidEnQueue(queue*q,Elemtypedata){  assert(q);  if(q-front==NULL)  {    LNode*node=calloc(1,sizeof(LNode));    node-data=data;    assert(node);    q-front=node;    q-rear=node;    q-len++;  }  else{    LNode*node=calloc(1,sizeof(LNode));    node-data=data;    assert(node);    q-rear-next=node;    q-len++;    q-rear=node;  }}

出队

这里我们要判断队列是否为空,如果不为空,则可以放回空值,如果不为空,即可返回值,上代码

ElemtypeDeQueue(queue*q){  assert(q);  if(q-len!=0)  {    LNode*node=q-front;    Elemtypedata=node-data;    q-len--;    q-front=node-next;    if(q-len==0)    {      q-rear==NULL;    }    free(node);    returndata;  }  else{    return-1;  }}

1
查看完整版本: 数据结构图解链表,用链表实现队列c语言