队列先不考虑循环队列, 作为链表而言,只能在尾部插入新元素,在头节点删除,其他位置不能改变。
而循环队列,特殊情况特殊考虑,还要考虑存储空间的大小。 有的时候还有双向链表的队列,麻烦死我了!
顺序队列
typedef int Position
;
struct QNode
{
ElementType
*Data
;
Position Front
, Rear
;
int MaxSize
;
};
typedef struct QNode
*Queue
;
Queue
CreateQueue( int MaxSize
)
{
Queue Q
= (Queue
)malloc(sizeof(struct QNode
));
Q
->Data
= (ElementType
*)malloc(MaxSize
* sizeof(ElementType
));
Q
->Front
= Q
->Rear
= 0;
Q
->MaxSize
= MaxSize
;
return Q
;
}
bool
IsFull( Queue Q
)
{
return ((Q
->Rear
+1)%Q
->MaxSize
== Q
->Front
);
}
bool
AddQ( Queue Q
, ElementType X
)
{
if ( IsFull(Q
) ) {
printf("队列满");
return false
;
}
else {
Q
->Rear
= (Q
->Rear
+1)%Q
->MaxSize
;
Q
->Data
[Q
->Rear
] = X
;
return true
;
}
}
bool
IsEmpty( Queue Q
)
{
return (Q
->Front
== Q
->Rear
);
}
ElementType
DeleteQ( Queue Q
)
{
if ( IsEmpty(Q
) ) {
printf("队列空");
return ERROR
;
}
else {
Q
->Front
=(Q
->Front
+1)%Q
->MaxSize
;
return Q
->Data
[Q
->Front
];
}
}
链队列
typedef struct Node
*PtrToNode
;
struct Node
{
ElementType Data
;
PtrToNode Next
;
};
typedef PtrToNode Position
;
struct QNode
{
Position Front
, Rear
;
int MaxSize
;
};
typedef struct QNode
*Queue
;
bool
IsEmpty( Queue Q
)
{
return ( Q
->Front
== NULL);
}
ElementType
DeleteQ( Queue Q
)
{
Position FrontCell
;
ElementType FrontElem
;
if ( IsEmpty(Q
) ) {
printf("队列空");
return ERROR
;
}
else {
FrontCell
= Q
->Front
;
if ( Q
->Front
== Q
->Rear
)
Q
->Front
= Q
->Rear
= NULL;
else
Q
->Front
= Q
->Front
->Next
;
FrontElem
= FrontCell
->Data
;
free( FrontCell
);
return FrontElem
;
}
}