假设以带头点的循环链表表示队列,链表长度为n,只设一个指针指向队尾元素节点,不设头指针,试编写相应的队列初始化、入队和出队的算法;
实现要求:
1、输入循环链表长度n;
2、入队m个元素;
3、打印队列中所有元素;
4、出队k个元素;
5、打印队列中的元素;
6、销毁队列。
输入:
8
6
1 2 3 4 5 6
3
输出:
1 2 3 4 5 6
4 5 6
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int QElemType;
typedef int Status;
typedef struct QNode{
QElemType data;
struct QNode *rear;
struct QNode *next;
}QNode,*Linklist;
Status InitQueue(Linklist *L){
(*L) = (Linklist)malloc(sizeof(QNode));
if((*L) == NULL)
return OVERFLOW;
(*L)->rear = (*L);
return OK;
}
void Enqueue(Linklist *L, QElemType e)
{
Linklist p;
p = (Linklist)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = (*L);
(*L)->rear->next = p;
(*L)->rear = p;
}
Status Dequeue(Linklist *L, QElemType e)
{
Linklist p;
if((*L)->rear->next == (*L)->rear)
return ERROR;
p = (*L)->rear->next->next;
e = p->data;
(*L)->rear->next->next = p->next;
free(p);
return OK;
}
void Print(Linklist L)
{
Linklist p;
p = L->next;
while(p != L){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void DestroyQueue(Linklist *L)
{
(*L)->rear = (Linklist)malloc(sizeof(QNode));
(*L)->rear = (*L)->rear->next->next;
free((*L)->rear->next);
(*L)->rear->next = (*L)->rear;
}
int main()
{
Linklist L;
QElemType length, m, e, k;
scanf("%d", &length);
scanf("%d", &m);
InitQueue(&L);
for(int i = 1; i <= m; i++)
{
scanf("%d",&e);
Enqueue(&L,e);
}
scanf("%d", &k);
Print(L);
for(int j = 1; j <= k; j++)
Dequeue(&L, e);
Print(L);
DestroyQueue(&L);
return 0;
}