队列与循环队列

复习一下队列与循环队列的实现(C语言)

 

1、单链队列:

 1 typedef struct QNode{ //若不写typedef,在C中每次定义QNode需要在前面加上struct,而C++不必

 2     QElemType data;

 3     struct QNode *next;

 4 }QNode,*QueuePtr;

 5 

 6 typedef struct{ //若不写结构体名,则需要加上typedef

 7     QueuePtr front;

 8     QueuePtr rear;

 9 }LinkQueue;

10 

11 status InitQueue(LinkQueue &Q){  //初始化

12     Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));

13     if(!Q.front)

14         exit(OVERFLOW);

15     Q.front -> next = NULL;

16     return OK;

17 }

18 

19 status EnQueue(LinkQueue &Q,QElemType &e){  //把元素e入队

20     p = (QueuePtr) malloc(sizeof(QNode));

21     if(!p)

22         exit(OVERFLOW);

23     p -> next = NULL;

24     p -> data = e;

25     Q.rear -> next = p;

26     Q.rear = p;

27     return OK;

28 }

29 

30 status Dequeue(LinkQueue &Q,QElemType &e){  //删除对头元素,且把队顶元素保存在e中

31     if(Q.front == Q.rear)

32         return ERROR;

33     p = Q.front -> next;

34     e = p -> data;

35     Q.front -> next = p -> next;

36     if(Q.rear == p)

37         Q.rear = Q.front;

38     free(p);

39     return OK;

40 }

 

2、循环队列

 1 #define MAXQSIZE 100

 2 

 3 typedef struct{

 4     QElemType *base;

 5     int front;

 6     int rear;

 7 }SqQueue;

 8 

 9 status InitQueue(SqQueue &Q){

10     Q.base = (QElemType *) malloc(MAXQSIZE*sizeof(QElemType));

11     if(!Q.base)

12         exit(OVERFLOW);

13     Q.front = Q.rear = 0;

14     return OK;

15 }

16 

17 status EnQueue(SqQueue &Q,QElemType &e){

18     if((Q.rear+1)%MAXQSIZE == Q.front)  //队列已满

19         return ERROR;

20     Q.base[Q.rear] = e;

21     Q.rear = (Q.rear+1)%MAXQSIZE;

22     return OK;

23 }

24 

25 status Dequeue(SqQueue &Q,QElemType &e){

26     if(Q.front == Q.rear)

27         return ERROR;

28     e = Q.base[Q.front];

29     Q.front = (Q.front+1)%MAXQSIZE;

30     return OK;

31 }

 

你可能感兴趣的:(队列)