mirror of
https://github.com/by777/dataStructureForC.git
synced 2026-02-02 17:48:51 +08:00
184 lines
3.1 KiB
C
184 lines
3.1 KiB
C
/*
|
||
* @Author: Xu Bai
|
||
* @Date: 2019-07-03 21:37:15
|
||
* @LastEditors: Xu Bai
|
||
* @LastEditTime: 2019-07-03 23:00:13
|
||
*/
|
||
|
||
#include "stdlib.h"
|
||
#include "stdio.h"
|
||
#include "io.h"
|
||
|
||
#define MAXSIZE 20
|
||
#define OVERFLOW -1
|
||
#define OK 1
|
||
#define ERROR 0
|
||
#define TRUE 1
|
||
#define FALSE 0
|
||
|
||
typedef int Status;
|
||
typedef int ElemType;
|
||
|
||
typedef struct QNode
|
||
{
|
||
ElemType data;
|
||
struct QNode *next;
|
||
} QNode, *QueuePtr;
|
||
|
||
typedef struct
|
||
{
|
||
QueuePtr front, rear;
|
||
} LinkQueue;
|
||
|
||
Status visit(ElemType e)
|
||
{
|
||
printf("%d ", e);
|
||
return OK;
|
||
}
|
||
|
||
Status InitQueue(LinkQueue *Q)
|
||
{
|
||
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
|
||
if (!Q->front)
|
||
{
|
||
exit(OVERFLOW);
|
||
}
|
||
Q->front->next = NULL;
|
||
return OK;
|
||
}
|
||
|
||
Status DestroyQueue(LinkQueue *Q)
|
||
{
|
||
while (Q->front)
|
||
{
|
||
// Q->rear没啥用,作为临时变量存放front后继结点
|
||
Q->rear = Q->front->next;
|
||
free(Q->front);
|
||
Q->front = Q->rear;
|
||
}
|
||
return OK;
|
||
}
|
||
|
||
Status ClearQueue(LinkQueue *Q)
|
||
{
|
||
// 与clear区别在于保留front和rear
|
||
QueuePtr p, q;
|
||
Q->rear = Q->front;
|
||
p = Q->front->next;
|
||
Q->front->next = NULL;
|
||
while (p)
|
||
{
|
||
q = p;
|
||
p = p->next;
|
||
free(q);
|
||
}
|
||
return OK;
|
||
}
|
||
|
||
Status QueueEmpty(LinkQueue Q)
|
||
{
|
||
if (Q.front == Q.rear)
|
||
{
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
int QueueLength(LinkQueue Q)
|
||
{
|
||
int i = 0;
|
||
QueuePtr p;
|
||
p = Q.front;
|
||
while (Q.rear != p)
|
||
{
|
||
i++;
|
||
p = p->next;
|
||
}
|
||
return i;
|
||
}
|
||
|
||
Status GetHead(LinkQueue Q, ElemType *e)
|
||
{
|
||
QueuePtr p;
|
||
if (Q.rear == Q.front)
|
||
{
|
||
return ERROR;
|
||
}
|
||
p = Q.front->next;
|
||
*e = p->data;
|
||
return OK;
|
||
}
|
||
|
||
Status EnQueue(LinkQueue *Q, ElemType e)
|
||
{
|
||
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
|
||
if (!p)
|
||
{
|
||
exit(OVERFLOW);
|
||
}
|
||
p->data = e;
|
||
p->next = NULL;
|
||
Q->rear->next = p; // 把新节点p作为rear
|
||
Q->rear = p;
|
||
return OK;
|
||
}
|
||
|
||
Status DeQueue(LinkQueue *Q, ElemType *e)
|
||
{
|
||
if (Q->rear == Q->front)
|
||
{
|
||
return ERROR;
|
||
}
|
||
QueuePtr p = Q->front->next;
|
||
*e = p->data;
|
||
Q->front->next = p->next;
|
||
if (Q->rear == p)
|
||
{
|
||
// 当除了头节点只剩下一个元素时,需要把rear指向头节点
|
||
Q->rear = Q->front;
|
||
}
|
||
free(p);
|
||
return OK;
|
||
}
|
||
|
||
Status QueueTraverse(LinkQueue Q)
|
||
{
|
||
QueuePtr p;
|
||
p = Q.front->next;
|
||
while (p)
|
||
{
|
||
visit(p->data);
|
||
p = p->next;
|
||
}
|
||
printf("\n");
|
||
return OK;
|
||
}
|
||
|
||
int main()
|
||
{
|
||
ElemType e;
|
||
LinkQueue q;
|
||
int i = InitQueue(&q);
|
||
if (i)
|
||
{
|
||
printf("inited! \n");
|
||
printf("Empty? 1 or 0: %d\n", QueueEmpty(q));
|
||
}
|
||
EnQueue(&q, -5);
|
||
EnQueue(&q, 5);
|
||
EnQueue(&q, 10);
|
||
printf("EnQueue(-5,5,10), Length=%d\n", QueueLength(q));
|
||
QueueTraverse(q);
|
||
i = GetHead(q, &e);
|
||
if (i == OK)
|
||
printf("GetHead:%d\n", e);
|
||
DeQueue(&q, &e);
|
||
printf("DeQueue:%d\n", e);
|
||
QueueTraverse(q);
|
||
ClearQueue(&q);
|
||
printf("Clear: q.front=%u q.rear=%u q.front->next=%u\n", q.front, q.rear, q.front->next);
|
||
DestroyQueue(&q);
|
||
printf("Destroy: ,q.front=%u q.rear=%u\n", q.front, q.rear);
|
||
getchar();
|
||
return OK;
|
||
} |