//队列的链式存储结构
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int DataType;
//队列节点存储结构
typedef struct Node
{
DataType data;
struct Node *next;
} Node, *pNode;
//队列存储结构
typedef struct Queue
{
pNode front;
pNode rear;
int queuesize;
} LinkQueue, *pLinkQueue;
pLinkQueue InitLinkQueue()
{
pLinkQueue q=(pLinkQueue ) malloc(sizeof(LinkQueue)) ;
if(!q)
{
q->front=NULL;
q->rear=NULL;
q->queuesize=0;
}
return q;
}
int IsLinkQueueEmpty(pLinkQueue q)
{
if(q->queuesize ==0)
return 1;
else
return 0;
}
int GetLinkQueueLength(pLinkQueue q)
{
return q->queuesize;
}
void EnLinkQueue(pLinkQueue q, DataType x)
{
if( q )
{
pNode p=(pNode ) malloc(sizeof(Node) ) ;
p->data=x;
p->next=NULL;
if(q->queuesize==0) //刚开始时队列为空时,对队头指针进行赋值
{
q->front=p;
q->rear=p;
}
else
{
q->rear->next=p;
q->rear=p;
}
q->queuesize++;
}
}
void DeLinkQueue(pLinkQueue q,DataType *x)
{
if(q->queuesize==0)
{
printf("the queue is null,can't get anything\n");
}
else
{
if(q->front==q->rear) //只有一个节点时,无节点的情况上面已经考虑了
{
*x=q->front->data;
free(q->front);
q->front=NULL;
q->rear=NULL;
}
else
{
pNode p=q->front;
*x=p->data;
q->front=q->front->next;
free(p);
}
q->queuesize--;
}
}
int GetHead(pLinkQueue q,DataType *x)
{
if(q->queuesize==0)
return 0 ;
else
{
*x= q->front->data;
return 1 ;
}
}
void print(DataType data)
{
printf("%d ",data);
}
void LinkQueueTraverse(pLinkQueue q, void (*Visit) (DataType data) )
{
if(!q)
exit(-1);
pNode p=q->front ;
if(!p)
{
printf("the LinkQueue is null\n");
return ;
}
while(p)
{
Visit(p->data);
p=p->next ;
}
}
void ClearLinkQueue(pLinkQueue q)
{
DataType data;
while(q->queuesize)
{
DeLinkQueue(q,&data);
}
}
void DestroyLinkQueue(pLinkQueue q)
{
if(q->queuesize!=0)
ClearLinkQueue(q) ;
free(q);
}
int main()
{
pLinkQueue q=InitLinkQueue();
int i;
DataType data;
for ( i=0;i<100;i++)
{
EnLinkQueue(q, i) ;
}
printf("gettop :\n");
GetHead(q, &data) ;
printf("%d ",data);
printf("\nIsLinkQueueEmpty %d",IsLinkQueueEmpty(q) );
printf("\n traverse the LinkQueue:\n");
LinkQueueTraverse(q ,print);
printf("\n the current LinkQueue' size(length) :%d\n",GetLinkQueueLength(q) );
DeLinkQueue(q,&data);
printf("DeLinkQueue %d \n",data);
printf("\n the current LinkStack' size :%d\n",GetLinkQueueLength(q) );
DeLinkQueue(q,&data);
printf("DeLinkQueue %d \n",data);
printf("\ntraverse the LinkQueue:\n");
LinkQueueTraverse(q ,print);
printf("\nLinkQueue clear!\n");
ClearLinkQueue(q);
printf("\ntraverse the LinkQueue:\n");
LinkQueueTraverse(q ,print);
printf("LinkQueue destroy!\n");
DestroyLinkQueue(q);
return 1;
}
链式队列的实现LinkQueue
最新推荐文章于 2022-06-27 21:05:20 发布