一、队列的链式存储结构
队列的链式存储也称链式队列,是一个特殊的链表;其中链表的头部结点链式队列的队头实现数据的删除和查看,也是出队端;链表的尾部结点实现数据的插入,也是入队端。
二、链表结构
//构建数据域类型
typedef int data_t;
//链式结点类型
typedef struct node{
data_t data;//结点数据域
struct node *next;//结点指针域
}node_t;
//链式队列结构体
typedef struct linkqueue{
node_t *front; //队头结点指针
node_t *rear; //队尾结点指针
}linkqueue_t;
三、链表操作函数实现
//初始化链队列
linkqueue_t *CreateLinkQueue()
{
linkqueue_t *queue;
queue = malloc(sizeof(linkqueue_t));
if(queue == NULL)
return NULL;
queue->front = malloc(sizeof(node_t));
if(queue->front == NULL)
{
free(queue);
return NULL;
}
queue->rear = queue->front;
return queue;
}
//入队
int EnLinkQueue(linkqueue_t *queue,data_t mydata)
{
node_t *p;
if(queue == NULL)
return -1;
//创建入队结点并初始化
p = malloc(sizeof(node_t));
if(p == NULL)
return -1;
p->data = mydata;
//入队
p->next = NULL;
queue->rear->next = p;
queue->rear = p;
return 0;
}
//获取队头元素
int GetLinkQueue(linkqueue_t *queue,data_t *mydata)
{
//判断队列是否有
if(queue == NULL)
return -1;
//队列中是否有元素
if(queue->front->next == NULL)
return -1;
*mydata = queue->front->next->data;
return 0;
}
//出队
int DeLinkQueue(linkqueue_t *queue)
{
node_t *p;
if(queue == NULL)
return -1;
if(queue->front->next == NULL)
return -1;
//出队
p = queue->front->next;
queue->front->next = p->next;
free(p);
//若出队结点为最后一个结点
if(queue->front->next == NULL)
queue->rear = queue->front;
return 0;
}
四、主函数实现和实现结果
int main()
{
int i;
linkqueue_t *queue;
data_t mydata;
queue = CreateLinkQueue(10);
if(queue == NULL)
return -1;
i = 20;
while(i){
if(EnLinkQueue(queue,i--)== -1)
{
printf("%d en fial\n",i);
}
}
while(GetLinkQueue(queue,&mydata)==0)
{
printf("de:%d\n",mydata);
DeLinkQueue(queue);
}
return 0;
}