/*
* link_queue.h
*
* Created on: 2011-9-5
* Author: liusheng
*/
#ifndef LINK_QUEUE_H_
#define LINK_QUEUE_H_
#define ElemType int
#define TRUE 1
#define FALSE 0
//队列节点的组成部分
typedef struct node{
ElemType elem;
struct node *next;
}node,*queueprt;
typedef struct {
queueprt font;
queueprt rear;
}linkqueue;
//初始化队列
int initlinkqueue(linkqueue *lq) {
lq->font = (node *)malloc(sizeof(node));
if(lq->font == NULL) return FALSE;
lq->rear = lq->font;
lq->font->next = NULL;
return TRUE;
}
//向队尾添加数据
int addnodetail(linkqueue *lq,ElemType e) {
node *temp;
temp = (node *)malloc(sizeof(node));
if(temp == NULL) return FALSE;
lq->rear->next = temp;
lq->rear = temp;
lq->rear->elem = e;
lq->rear->next = NULL;
return TRUE;
}
//得到队列的队头
int getfontnode(linkqueue *lq,ElemType *e) {
if(lq->font->next == NULL) return FALSE;
*e = lq->font->next->elem;
return TRUE;
}
//删除队头的数据,并通过e得到删除过的数据的值
int deletefontnode(linkqueue *lq,ElemType *e) {
node *temp;
if(lq->font->next == NULL) return FALSE;
if(lq->font->next != lq->rear) {
temp = lq->font->next;
lq->font->next = temp->next;
*e = temp->elem;
} else {
*e = lq->rear->elem;
lq->rear = lq->font;
lq->font->next = NULL;
}
return TRUE;
}
//输出队列中的所有节点
void printflinkqueue(linkqueue *lq) {
node *temp;
temp = lq->font->next;
while(temp != NULL) {
printf("elem = %d ",temp->elem);
temp = temp->next;
}
printf("\n");
}
#endif /* LINK_QUEUE_H_ */
/*
* linkqueue.c
* 对link_queue.h测试
* Created on: 2011-9-5
* Author: liusheng
*/
#include <stdio.h>
#include <stdlib.h>
#include "link_queue.h"
int main(void) {
linkqueue lq;
initlinkqueue(&lq);
//测试入对
addnodetail(&lq,1);
addnodetail(&lq,6);
addnodetail(&lq,4);
addnodetail(&lq,4);
addnodetail(&lq,8);
printflinkqueue(&lq);
ElemType e;
addnodetail(&lq,12);
//测试出队
deletefontnode(&lq,&e);
printf("e = %d\n",e);
//测试得到队头数据
getfontnode(&lq,&e);
printf("e = %d\n",e);
printflinkqueue(&lq);
return 0;
}
//以下是控制台的输出数据
elem = 1 elem = 6 elem = 4 elem = 4 elem = 8
e = 1
e = 6
elem = 6 elem = 4 elem = 4 elem = 8 elem = 12