parent
071b1ba1fe
commit
ccadc11d7f
@ -0,0 +1,162 @@
|
|||||||
|
#include"stdio.h"
|
||||||
|
#include"stdlib.h"
|
||||||
|
typedef int QueueElem;
|
||||||
|
|
||||||
|
// 队列结点类型
|
||||||
|
typedef struct linkQueueNode
|
||||||
|
{
|
||||||
|
QueueElem data;
|
||||||
|
struct linkQueueNode *next;
|
||||||
|
}LinkQueueNode;
|
||||||
|
|
||||||
|
// 队列
|
||||||
|
typedef struct linkQueue
|
||||||
|
{
|
||||||
|
LinkQueueNode *front; // 队头指针
|
||||||
|
LinkQueueNode *rear; // 队尾指针
|
||||||
|
int QueueLen; // 队列长度
|
||||||
|
}LinkQueue;
|
||||||
|
|
||||||
|
// 1. 初始化一个队列
|
||||||
|
LinkQueue *initQueue()
|
||||||
|
{
|
||||||
|
LinkQueue *queue = (LinkQueue* )malloc(sizeof(LinkQueue));
|
||||||
|
queue->front = queue->rear = NULL;
|
||||||
|
queue->QueueLen = 0;
|
||||||
|
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 入队
|
||||||
|
int enterQueue(LinkQueue *Queue, QueueElem data)
|
||||||
|
{
|
||||||
|
// 申请一个队列元素空间z
|
||||||
|
LinkQueueNode *QNode = (LinkQueueNode* )malloc(sizeof(LinkQueueNode));
|
||||||
|
if ( QNode == NULL )
|
||||||
|
return -1; //入队失败
|
||||||
|
QNode->data = data;
|
||||||
|
QNode->next = NULL;
|
||||||
|
|
||||||
|
// 入队 -- 尾插
|
||||||
|
// 队列为空
|
||||||
|
if ( Queue->rear == NULL )
|
||||||
|
Queue->front = Queue->rear = QNode;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Queue->rear->next = QNode;
|
||||||
|
Queue->rear = QNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue->QueueLen++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 判断队列是否为空
|
||||||
|
int QueueIsEmpty(LinkQueue *Queue)
|
||||||
|
{
|
||||||
|
return Queue->QueueLen;
|
||||||
|
}
|
||||||
|
//#define QueueLen(Queue) QueueIsEmpty(Queue)
|
||||||
|
|
||||||
|
// 3. 出队
|
||||||
|
QueueElem delQueue(LinkQueue *Queue)
|
||||||
|
{
|
||||||
|
// 如果队列不为空
|
||||||
|
if ( QueueIsEmpty(Queue) )
|
||||||
|
{
|
||||||
|
// 摘除头部结点
|
||||||
|
LinkQueueNode *p = Queue->front;
|
||||||
|
Queue->front = Queue->front->next;
|
||||||
|
p->next = NULL;
|
||||||
|
|
||||||
|
// 如果只有一个结点
|
||||||
|
Queue->rear = Queue->front ? Queue->rear : NULL;
|
||||||
|
|
||||||
|
// 保留结点的数据域 释放掉结点
|
||||||
|
QueueElem data = p->data;
|
||||||
|
// Queue->front->next->data = p->front->data;
|
||||||
|
free(p);
|
||||||
|
|
||||||
|
Queue->QueueLen--;
|
||||||
|
//free(p);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1; // 出队失败
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 获取队头元素
|
||||||
|
QueueElem getFront(LinkQueue *Queue)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 如果队列不为空
|
||||||
|
if ( QueueIsEmpty(Queue) )
|
||||||
|
return Queue->front->data;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define QueueLen(Queue) QueueIsEmpty(Queue)
|
||||||
|
// 6. 获取队列长度
|
||||||
|
int QueueLen(LinkQueue *Queue)
|
||||||
|
{
|
||||||
|
return Queue->QueueLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 清空一个队列 --- 不断地出队
|
||||||
|
void clearQueue(LinkQueue *Queue)
|
||||||
|
{
|
||||||
|
while ( QueueIsEmpty(Queue) )
|
||||||
|
delQueue(Queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 销毁一个队列
|
||||||
|
void destoryQueue(LinkQueue **Queue)
|
||||||
|
{
|
||||||
|
clearQueue(*Queue);
|
||||||
|
free(*Queue);
|
||||||
|
*Queue = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
QueueElem x;
|
||||||
|
|
||||||
|
LinkQueue *Queue = initQueue();
|
||||||
|
|
||||||
|
// 不断入队
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
scanf("%d", &x);
|
||||||
|
if ( x == 0 )
|
||||||
|
{
|
||||||
|
printf("input finsh\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果入队列失败 直接退出程序
|
||||||
|
if ( enterQueue(Queue, x) == -1 )
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输出队列元素
|
||||||
|
printf ("Front Elem: %d QueueLen: %d\n", getFront(Queue), QueueLen(Queue));
|
||||||
|
|
||||||
|
// 如果队列不为空 就不断出队
|
||||||
|
while ( QueueIsEmpty(Queue) )
|
||||||
|
printf("%d ", delQueue(Queue));
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
enterQueue(Queue, 1);
|
||||||
|
enterQueue(Queue, 2);
|
||||||
|
|
||||||
|
printf ("Front Elem: %d\n", getFront(Queue));
|
||||||
|
|
||||||
|
// 销毁队列 并且将实参指向NULL
|
||||||
|
destoryQueue(&Queue);
|
||||||
|
if ( Queue == NULL )
|
||||||
|
printf("Destory Finsh\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in new issue