1链式队列
运行结果如下:
1.1链式队列结点定义
/*自定义一个数据类型*/
typedef struct student
{char name[32];char sex;int age;
}DATA_TYPE;
/*定义一个链式队列结点*/
typedef struct link_queue_node
{DATA_TYPE data;//数据域struct link_queue_node *pnext;//指针域
}LINK_QUEUE_NODE;
1.2链式队列队头结点定义
/*定义一个链式队列头*/
typedef struct link_queue_head
{LINK_QUEUE_NODE *pfront;LINK_QUEUE_NODE *prear;int clen;
}LINK_QUEUE_HEAD;
1.3创建链式队列的队头
/*==========创建一个链队队头==========*/
LINK_QUEUE_HEAD *create_link_queue_head(void)
{LINK_QUEUE_HEAD *phead=NULL;/*创建一个链式队列的队头空间*/phead=malloc(sizeof(LINK_QUEUE_HEAD));if(NULL==phead){perror("fail to malloc");return NULL;}/*初始化链式队列的队头*/phead->pfront=NULL;phead->prear=NULL;phead->clen=0;return phead;
}
1.4创建链式队列结点
/*==========创建一个链队结点==========*/
LINK_QUEUE_NODE *create_link_queue_node(DATA_TYPE data)
{LINK_QUEUE_NODE *pnode=NULL;/*创建一个链队结点空间*/pnode=malloc(sizeof(LINK_QUEUE_NODE));if(NULL==pnode){perror("fail to malloc");return NULL;}/*初始化链队结点*/pnode->data=data;pnode->pnext=NULL;return pnode;
}
1.5判断非空链式队列
/*==========判断非空链队==========*/
int is_empty_link_queue(LINK_QUEUE_HEAD *link_queue)
{return NULL==link_queue->pfront;
}
1.6入队
/*==========链式队列入队-尾插法==========*/
int push_link_queue(LINK_QUEUE_HEAD *link_queue,LINK_QUEUE_NODE *pnode)
{if(is_empty_link_queue(link_queue)){link_queue->prear=pnode;//更新链式队头尾指针link_queue->pfront=pnode;//更新链式队头头指针}else{link_queue->prear->pnext=pnode;//更新尾结点指针为指向新结点link_queue->prear=pnode;//更新链式队头尾指针}link_queue->clen++;return 0;
}
1.7出队
/*==========链式队列出队-头删法*/
int pop_link_queue(LINK_QUEUE_HEAD *link_queue,DATA_TYPE *data)
{LINK_QUEUE_NODE *pnode=NULL;if(is_empty_link_queue(link_queue)){return -1;}pnode=link_queue->pfront;//备份待出队的队首结点link_queue->pfront=pnode->pnext;//更新链式队列指向队首的指针if(NULL==link_queue->pfront){link_queue->prear=NULL;}if(data!=NULL){*data=pnode->data;}free(pnode);link_queue->clen--;return 0;
}
1.8遍历链式队列
/*==========链式队列的遍历==========*/
void link_queue_for_each(LINK_QUEUE_HEAD *link_queue,void (*pfun)(LINK_QUEUE_NODE *))
{LINK_QUEUE_NODE *ptmp=NULL;ptmp=link_queue->pfront;//初始化链式队列结点类型的中间指针变量为队首while(1){if(NULL==ptmp){break;}pfun(ptmp);ptmp=ptmp->pnext;}
}/*==========遍历方式==========*/
void show_data(LINK_QUEUE_NODE *pnode)
{printf("%-10s\t%-10c\t%-10d\n",pnode->data.name,pnode->data.sex,pnode->data.age);
}
1.9清空链式队列
/*==========清空链式队列==========*/
void clear_link_queue(LINK_QUEUE_HEAD *link_queue)
{while(1){if(is_empty_link_queue(link_queue)){break;}pop_link_queue(link_queue,NULL);}
}
1.10销毁链式队列
/*==========销毁链式队列==========*/
void destroy_queue(LINK_QUEUE_HEAD *link_queue)
{clear_link_queue(link_queue);free(link_queue);
}