/************************************************************************* * > File Name: queue.c * > Author:heathcliff * > Mail:------------------- * > Created Time: 2016年04月01日 星期五 14時45分50秒 * ************************************************************************/ /*隊列,隊尾入隊,隊頭出對*/ #include<stdio.h> #include<stdlib.h> typedef char ElemType; //ElemType至關於char typedef struct QNode{ ElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; //建立對頭指針 QueuePtr rear; //建立隊尾指針 }LinkQueue; int length = 0;//計算隊列的長度 /*初始化空隊列*/ initQueue(LinkQueue *q) { /*在這裏能夠創建一個head節點, * q->front = q->rear = head = (QueuePtr) malloc (sizeof(QNode)) 隊頭、隊尾指針指向頭節點 * head->next = NULL;頭節點指向空值 * q->front = head; * q->rear = head; */ q->front = q->rear = (QueuePtr) malloc (sizeof(QNode)); if(!q->front) exit(0);//建立頭節點失敗 q->front->next = NULL;//頭節點指向空值 } /*入隊操做*/ EnQueue(LinkQueue *q,ElemType e) { QueuePtr p; p = (QueuePtr) malloc (sizeof(QNode)); //爲p指針分配空間 if(!q->front) exit(0);//建立頭節點失敗 /*在隊尾插入值*/ p->data = e; p->next = NULL; q->rear->next = p; q->rear = p;//隊尾向後移動一位 /*檢校函數,目的是正確判斷是否傳入新值*/ /*可是這裏不知道爲什麼在打印時打印兩遍*/ printf("q->rear->data = %c\n",q->rear->data); length++;//每傳入一個新值,長度+1 } /*出對操做*/ DeQueue(LinkQueue *q,ElemType *e) { QueuePtr p; if(q->front == q->rear) return ;//隊列爲空 p = q->front->next; *e = p->data;//保存出對指針的信息 q->front->next = p->next;//頭指針向後移動一位 if(q->rear == p) q->rear = q->front; length --;//每出對一個值,長度-1 free(p); } int main(void) { ElemType e; LinkQueue q; initQueue(&q); printf("Please input a string into queue:\n"); scanf("%c",&e); while(e!='@'){ EnQueue(&q,e); scanf("%c",&e); printf("length = %d\n",length); } printf("The string into the queue is\n"); while(q.front !=q.rear){ DeQueue(&q,&e); printf("%c\n",e); printf("length = %d\n",length); } return 0; }