链队列
(a)空队列 (b)元素x入队列 (c)元素y入队列 (d)元素x出队列
队列的链式存储表示
typedef struct QNode
{
QElemType data
;
struct QNode
* next
;
}QNode
, * QueuePtr
;
typedef struct {
QueuePtr front
;
QueuePtr rear
;
}LinkQueue
;
基本操作的函数原型说明
Status
InitQueue(LinkQueue
& Q
);
Status
DestroyQueue(LinkQueue
& Q
);
Status
GetHead(LinkQueue Q
, QElemType
& e
);
Status
EnQueue(LinkQueue
& Q
, QElemType e
);
Status
DeQueue(LinkQueue
& Q
, QElemType
& e
);
void PrintQueue(LinkQueue Q
);
基本操作的实现
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
= Q
.front
->next
;
free(Q
.front
);
Q
.front
= Q
.rear
;
}
return OK
;
}
Status
GetHead(LinkQueue Q
, QElemType
& e
)
{
if (Q
.front
== Q
.rear
)
return ERROR
;
e
= Q
.front
->next
->data
;
return OK
;
}
Status
EnQueue(LinkQueue
& Q
, QElemType e
)
{
QueuePtr p
= (QueuePtr
)malloc(sizeof(QNode
));
if (!p
)
exit(OVERFLOW
);
p
->data
= e
;
p
->next
= NULL;
Q
.rear
->next
= p
;
Q
.rear
= p
;
return OK
;
}
Status
DeQueue(LinkQueue
& Q
, QElemType
& e
)
{
if (Q
.front
== Q
.rear
)
return ERROR
;
QueuePtr p
= Q
.front
->next
;
e
= p
->data
;
Q
.front
->next
= p
->next
;
if (Q
.rear
== p
)
Q
.rear
= Q
.front
;
free(p
);
return OK
;
}
void PrintQueue(LinkQueue Q
)
{
printf("队列值为:");
QueuePtr p
= Q
.front
;
while (p
->next
!= NULL)
{
printf("%d ",p
->next
->data
);
p
= p
->next
;
}
printf("\n");
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status
;
typedef int QElemType
;
typedef struct QNode
{
QElemType data
;
struct QNode
* next
;
}QNode
, * QueuePtr
;
typedef struct {
QueuePtr front
;
QueuePtr rear
;
}LinkQueue
;
Status
InitQueue(LinkQueue
& Q
);
Status
DestroyQueue(LinkQueue
& Q
);
Status
GetHead(LinkQueue Q
, QElemType
& e
);
Status
EnQueue(LinkQueue
& Q
, QElemType e
);
Status
DeQueue(LinkQueue
& Q
, QElemType
& e
);
void PrintQueue(LinkQueue Q
);
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
= Q
.front
->next
;
free(Q
.front
);
Q
.front
= Q
.rear
;
}
return OK
;
}
Status
GetHead(LinkQueue Q
, QElemType
& e
)
{
if (Q
.front
== Q
.rear
)
return ERROR
;
e
= Q
.front
->next
->data
;
return OK
;
}
Status
EnQueue(LinkQueue
& Q
, QElemType e
)
{
QueuePtr p
= (QueuePtr
)malloc(sizeof(QNode
));
if (!p
)
exit(OVERFLOW
);
p
->data
= e
;
p
->next
= NULL;
Q
.rear
->next
= p
;
Q
.rear
= p
;
return OK
;
}
Status
DeQueue(LinkQueue
& Q
, QElemType
& e
)
{
if (Q
.front
== Q
.rear
)
return ERROR
;
QueuePtr p
= Q
.front
->next
;
e
= p
->data
;
Q
.front
->next
= p
->next
;
if (Q
.rear
== p
)
Q
.rear
= Q
.front
;
free(p
);
return OK
;
}
void PrintQueue(LinkQueue Q
)
{
printf("队列值为:");
QueuePtr p
= Q
.front
;
while (p
->next
!= NULL)
{
printf("%d ",p
->next
->data
);
p
= p
->next
;
}
printf("\n");
}
int main()
{
LinkQueue Q
;
InitQueue(Q
);
EnQueue(Q
, 1);
EnQueue(Q
, 2);
EnQueue(Q
, 3);
PrintQueue(Q
);
return 0;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-49724.html