Loading

队列的链表实现

  1 /*
  2   队列的链表实现。
  3   队列是一种在表头删除,表尾插入的表。
  4   队列的出队和入队操作要更新队尾和队头。
  5   对于带头结点的队列,当队尾指向头结点,队头指向NULL则队列为空对。 
  6 */
  7 
  8 /*接口头文件*/
  9 typedef int ElementType;
 10 #ifndef _QUEUE_H
 11 #define _QUEUE_H
 12 #include <stdbool.h>
 13 
 14 struct Node;
 15 typedef struct Node * PtrToNode;
 16 typedef PtrToNode Queue;
 17 typedef PtrToNode Position;
 18 
 19 /*操作集*/
 20 Queue CreateQueue( void );
 21 void MakeEmpty( Queue Q );
 22 bool IsEmpty( Queue Q );
 23 void Enqueue( ElementType X, Queue Q );
 24 void Dequeue( Queue Q );
 25 ElementType Front( Queue Q );
 26 ElementType FrontAndDequeue( Queue Q );
 27 void DisposeQueue( Queue Q );
 28 void PrintfQueue( Queue Q );
 29 
 30 #endif 
 31 
 32 
 33 /*接口实现*/
 34 #include <stdio.h>
 35 #include <stdlib.h>
 36 #include "queue.h"
 37 
 38 /*特定结构体定义*/
 39 struct Node
 40 {
 41     ElementType Element;
 42     Position Next;
 43     Position Front;   //队头 
 44     Position Rear;    //队尾 
 45 };
 46 
 47 /*创建队列*/
 48 Queue CreateQueue( void )
 49 {
 50     Queue Q;
 51     
 52     Q = ( Queue )malloc( sizeof( struct Node ) );
 53     if ( Q == NULL )
 54     {
 55        printf( "No Space!!!\n" );
 56        exit( 1 );
 57     }
 58     Q->Next = NULL;
 59     /*初始化为空队*/
 60     MakeEmpty( Q );
 61     
 62     return Q; 
 63 }
 64 
 65 /*使队列为空*/
 66 void MakeEmpty( Queue Q )
 67 {
 68     if ( ! IsEmpty( Q ) )
 69        DisposeQueue;
 70     
 71     Q->Front = NULL;
 72     Q->Rear = Q;
 73     Q->Element = 0;
 74 }
 75 
 76 bool IsEmpty( Queue Q )
 77 {
 78     return Q->Next == NULL;
 79 }
 80 
 81 void DisposeQueue( Queue Q )
 82 {
 83     Position Temp;
 84     Position P;
 85     
 86     P = Q->Next;
 87     Q->Next = NULL;
 88     
 89     while ( P != NULL )
 90     {
 91         Temp = P->Next;
 92         free( P );
 93         P = Temp;
 94     }
 95 }
 96 
 97 void Enqueue( ElementType X, Queue Q )
 98 {
 99     Position NewNode;
100     
101     NewNode = ( Queue )malloc( sizeof( struct Node ) );
102     if ( NewNode == NULL )
103     {
104        printf( "No Space!!!\n" );
105        exit( 1 );
106     }
107     else
108     {
109         NewNode->Element = X;
110         NewNode->Next = NULL;
111         
112         if ( IsEmpty( Q ) )
113            Q->Front = NewNode;
114            
115         Q->Rear->Next = NewNode;
116         
117         Q->Rear = NewNode;
118         Q->Element++;
119     }
120 }
121 
122 void Dequeue( Queue Q )
123 {
124     if ( IsEmpty( Q ) )
125     {
126        printf( "Queue is empty\n" );
127        exit( 1 );
128     }
129     else
130     {
131         if ( Q->Next->Next == NULL )
132            Q->Rear = Q;
133            
134         Q->Front = Q->Front->Next;
135         free( Q->Next );
136         Q->Next = Q->Front;
137         Q->Element--;
138     }
139 }
140 
141 ElementType Front( Queue Q )
142 {
143     if ( IsEmpty( Q ) )
144     {
145        printf( "Queue is empty\n" );
146        exit( 1 );
147     }
148     else
149         return Q->Front->Element;
150 }
151 
152 ElementType FrontAndDequeue( Queue Q )
153 {
154     ElementType n;
155     
156     if ( IsEmpty( Q ) )
157     {
158        printf( "Queue is empty\n" );
159        exit( 1 );
160     }
161     else
162     {
163         n = Q->Front->Element;
164         if ( Q->Next->Next == NULL )
165            Q->Rear = Q;
166            
167         Q->Front = Q->Front->Next;
168         free( Q->Next );
169         Q->Next = Q->Front;
170         Q->Element--;
171         return n;
172     }
173 }
174 
175 void PrintfQueue( Queue Q )
176 {
177     while ( ! IsEmpty( Q ) )
178         printf( "%3d",FrontAndDequeue( Q ) );
179     
180     printf( "\n" );
181 }

 

posted @ 2017-08-08 16:17  未夏  阅读(259)  评论(0编辑  收藏  举报