队列操作

1、设计节点:

1 typedef struct Node{
2     int data;
3     struct Node *next;
4 }Node,*Queue;  //节点结构
5 
6 typedef struct{
7     Queue front;//队头
8     Queue rear;//队尾
9 }LinkQueue;

2.初始化队列

void initQueue(LinkQueue *queue)
{
    queue->front = queue->rear=(Queue)malloc(sizeof(struct Node));//为队头和队尾节点分配内存
    if(queue->front==NULL)
    {
        exit(0);
    }
    queue->rear->next=NULL;//让队尾的下个节点为空
}

3、判断队列是否为空

bool Isempty(LinkQueue queue)
{
    return queue.front==queue.rear?true:false;//就是判断队头和队尾是否相等
}

4、入队操作

void insertQueue(LinkQueue *queue,int value)//因为不是循环队列所以不需要判断是否满
{
      /*初始化新节点*/ Queue q
= (Queue)malloc(sizeof(struct Node)); if(q==NULL) exit(0); q->data=value; q->next=NULL;
    /*尾部插入节点*/ queue
->rear->next=q; queue->rear = q; }

5、出队操作

 1 void deleteQueue(LinkQueue *queue)
 2 {
 3     Queue q = NULL;
    /*不为空则节点头部出队*/
4 if(!Isempty(*queue)) 5 { 6 q=queue->front->next; 7 queue->front->next=q->next; 8 }
    /*只剩队头一个元素时,将队头赋值给队尾*/
9 if(queue->rear ==q) 10 { 11 queue->rear = queue->front; 13 } 14 free(q); 16 }

6、队列的遍历

 1 void traversal(LinkQueue queue)//头部开始遍历
 2 {
 3     int i = 1;
 4     Queue q=queue.front->next;
  /*q指针向队尾移动遍历,得到队列中存放的value*/
5 while(q!=NULL) 6 { 7 printf("i= %d,data = %d ",i,q->data); 8 q = q->next; 9 i++; 10 11 } 12 }

7、队列的销毁

 1 void destoryQueue(LinkQueue *queue)
 2 {
 3     while(queue->front != NULL)
 4     {
    /*front和rear一前一后,不断释放前一个指针,然后将后一个指针赋值给前一指针*/
5 queue->rear = queue->front->next; 6 free(queue->front); 7 queue->front = queue->rear; 8 9 } 10 printf("destoried! "); 11 12 }

完整代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<stdbool.h>
  4 typedef struct Node{
  5     int data;
  6     struct Node *next;
  7 }Node,*Queue;
  8 
  9 typedef struct{
 10     Queue front;
 11     Queue rear;
 12 }LinkQueue;
 13 
 14 void initQueue(LinkQueue *queue)
 15 {
 16     queue->front = queue->rear=(Queue)malloc(sizeof(struct Node));
 17     if(queue->front==NULL)
 18     {
 19         exit(0);
 20     }
 21     queue->rear->next=NULL;
 22 
 23 }
 24 bool Isempty(LinkQueue queue)
 25 {
 26     return queue.front==queue.rear?true:false;
 27 }
 28 
 29 void insertQueue(LinkQueue *queue,int value)
 30 {
 31     Queue q = (Queue)malloc(sizeof(struct Node));
 32     if(q==NULL)
 33     exit(0);
 34     q->data=value;
 35     q->next=NULL;
 36     queue->rear->next=q;
 37     queue->rear = q;
 38 }
 39 
 40 void deleteQueue(LinkQueue *queue)
 41 {
 42     Queue q = NULL;
 43     if(!Isempty(*queue))
 44     {
 45         q=queue->front->next;
 46         queue->front->next=q->next;
 47     }
 48     if(queue->rear ==q)
 49     {
 50     queue->rear = queue->front;
 51 
 52     }
 53     free(q);
 54 
 55 }
 56 
 57 void traversal(LinkQueue queue)
 58 {
 59     int i = 1;
 60     Queue q=queue.front->next;
 61     while(q!=NULL)
 62     {
 63         printf("i= %d,data = %d
",i,q->data);
 64         q = q->next;
 65         i++;
 66 
 67     }
 68 }
 69 
 70 void destoryQueue(LinkQueue *queue)
 71 {
 72     while(queue->front != NULL)
 73     {
 74     queue->rear = queue->front->next;
 75     free(queue->front);
 76     queue->front = queue->rear;
 77 
 78     }
 79     printf("destoried!
");
 80 
 81 }
 82 
 83 int main()
 84 {
 85     LinkQueue queue;
 86     initQueue(&queue);
 87     insertQueue(&queue,2);
 88     insertQueue(&queue,2);
 89     insertQueue(&queue,2);
 90     insertQueue(&queue,2);
 91 
 92     insertQueue(&queue,2);
 93     traversal(queue);
 94     deleteQueue(&queue);
 95     traversal(queue);
 96     
 97     destoryQueue(&queue);
 98 
 99 
100 }

typedef struct Node{int data;struct Node *next;}Node,*Queue;
typedef struct{Queue front;Queue rear;}LinkQueue;

原文地址:https://www.cnblogs.com/defen/p/5574747.html