/**************************************************************** 文件内容:线性表之链队操作 版本V1.0 作者:HFL 时间:2013-12-22 *****************************************************************/ #include<stdio.h> #include<stdlib.h> //#define RELEASE_VERSION //release版本开关 //#define TRIDiTION /*inlude<malloc.h> stdlib.h 包含malloc.h*/ #ifdef RELEASE_VERSION #define Log #else #define Log printf #endif /*为了提高程序的可移植性,千万不能使用裸露的数据类型*/ #ifndef UINT32 typedef unsigned int UINT32 ; #endif #ifndef INT32 typedef int INT32 ; #endif typedef struct Node { INT32 data; struct Node * next; }linksequeue, * LkSq; typedef struct Pointer { LkSq Rear; LkSq Front; }Hander; Hander * p = NULL; /**************************************************************** 函数功能:创建一个节点 输入参数: 无 返回值:节点的指针 作者:HFL 时间:2013-12-22 *****************************************************************/ LkSq Creat_Node(INT32 X) { LkSq s; s=(struct Node *)malloc(sizeof(Node)); if(NULL==s) { Log(" sorry,Malloc is failed\n"); } else { Log(" Malloc is successed!\n"); s->data = X; } return s; } /**************************************************************** 函数功能:初始化链队 输入参数: 无 返回值: 链队的队顶指针指针 作者:HFL 时间:2013-12-29 *****************************************************************/ LkSq Init_Linkqueue() { LkSq q = NULL; q = (struct Node *)malloc(sizeof(struct Node)); if(NULL== q) { Log(" sorry,Malloc Node is failed\n"); } p = (struct Pointer *)malloc(sizeof(struct Pointer)); if(NULL== p) { Log(" sorry,Malloc Hander is failed\n"); } p->Front = q; p->Rear = q; q->next = NULL; return q; } /**************************************************************** 函数功能:判断链队是否为空队 输入参数: 无 返回值: 链队的标头指针 说明:链队是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆队来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 Is_Empty_Linkqueue(Hander * p) { if ( p->Front == p->Rear) { Log("sorry,the linkqueueis NULL"); return 0; } else { return 1; } } /**************************************************************** 函数功能: 链队入队 输入参数: 无 返回值: 链的队的标准指针 说明:链队是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆队来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ LkSq FIFO_IN_Linkqueue(INT32 X) { LkSq s; s = Creat_Node(X); p->Rear->next = s; s->next = NULL ; p->Rear = s; return s; } /**************************************************************** 函数功能: 链队出队 输入参数: 无 返回值: 链的队的标准指针 说明:链队是由链来实现,所有的操作方式都是跟链表一样,只是某些操作队列来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 FIFO_OUT_Linkqueue() { INT32 temp; LkSq s; if(!Is_Empty_Linkqueue(p)) { return -1; } temp = p->Front->next->data; //还有节点的头节点需要考虑(头结点的数据域为空) s = p->Front->next; p->Front->next = p->Front->next->next; free (s); if( NULL == p->Front->next ) { p->Front = p->Rear; //如果出队列后队列数据为空,收尾指针要修正) } return temp; } /**************************************************************** 函数功能: 链队读前指针元素 输入参数: 无 返回值: 链的队的头指针指向的元素 说明:链队是由链来实现,所有的操作方式都是跟链表一样,只是某些操作队列来说是 非法的。 出队会修改栈顶指针,而读队前元素,不需修改头指针 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 Read_Linkstack( ) { INT32 temp; if(!Is_Empty_Linkqueue(p)) { return -1; } temp = p->Front->next->data; return temp; } void main() { INT32 i ; Log("*********************************\n"); Log("* *\n"); Log("* Init Linkqueue is start ! *\n"); Log("* *\n"); Log("*********************************\n"); Init_Linkqueue(); Log("********************************\n"); Log("* *\n"); Log("* Into Linkqueue is start ! *\n"); Log("* *\n"); Log("*********************************\n"); for(i=0;i<12;i++) { FIFO_IN_Linkqueue(i*2); } Log("*******************************\n"); Log("* *\n"); Log("* Output Linkqueue is start ! *\n"); Log("* *\n"); Log("*******************************\n"); for(i=0;i<10;i++) { Log("The OUTOUT element is %d\n",FIFO_OUT_Linkqueue()); } Log("**************************************\n"); Log("* *\n"); Log("* Read Linkqueue Front is start ! *\n"); Log("* *\n"); Log("**************************************\n"); Log("The OUTOUT element is %d\n",Read_Linkstack()); }算法与数据结构之八----链队