队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列就像生活中排队一样,从队头出,队尾进,不允许插队。
代码#include#include typedef struct LinkNode{ int data; struct LinkNode* next; }*LNPtr;//创建链队列节点 typedef struct LQueue{ LNPtr front; LNPtr rear; }LQueue,*LQueuePtr;//创建链队列 LQueuePtr initQueue(){ LQueuePtr resultPtr = (LQueuePtr)malloc(sizeof( LQueue)); LNPtr headPtr = (LNPtr)malloc(sizeof( LNPtr)); headPtr->next = NULL; resultPtr->front = headPtr; resultPtr->rear = headPtr; return resultPtr; }//创建一个空的队列 void outputLQueue(LQueuePtr paraQueuePtr){ LNPtr tempPtr = paraQueuePtr->front->next; while(tempPtr != NULL){//不为空才能打印 if(tempPtr->data <= 0){ printf("r输入错误,请重新输入");//我规定输入小于0则无法储存 return; } printf("%d ", tempPtr->data); tempPtr = tempPtr->next; } printf("rn"); } //打印函数 void enqu(LQueuePtr paraQueuePtr, int paraElement){ LNPtr tempnodePtr = (LNPtr)malloc(sizeof(LNPtr)); tempnodePtr->data = paraElement; tempnodePtr->next = NULL; paraQueuePtr->rear->next = tempnodePtr; paraQueuePtr->rear = tempnodePtr; }//入队 int dequ(LQueuePtr paraQueuePtr){ int resultValue; LNPtr tempnodePtr; if(paraQueuePtr->front == paraQueuePtr->rear){ printf("队列为空rn"); return -1; }//队列为空 tempnodePtr = paraQueuePtr->front->next; resultValue = tempnodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if(paraQueuePtr->rear == tempnodePtr){ paraQueuePtr->rear = paraQueuePtr->front; } tempnodePtr = NULL; return resultValue; }//出队 void testLinkQueue(){ LQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqu(tempQueuePtr, 10); enqu(tempQueuePtr, 30); enqu(tempQueuePtr, 50); outputLQueue(tempQueuePtr); printf("dequeue gets %drn", dequ(tempQueuePtr)); printf("dequeue gets %drn", dequ(tempQueuePtr)); printf("dequeue gets %drn", dequ(tempQueuePtr)); printf("dequeue gets %drn", dequ(tempQueuePtr)); enqu(tempQueuePtr, 8); enqu(tempQueuePtr, 9); enqu(tempQueuePtr, 10); enqu(tempQueuePtr, 500); enqu(tempQueuePtr, 600); enqu(tempQueuePtr, 700); enqu(tempQueuePtr, -100); outputLQueue(tempQueuePtr); }//测试 int main(){ testLinkQueue(); return 0; }
void enqu(LQueuePtr paraQueuePtr, int paraElement){
LNPtr tempnodePtr = (LNPtr)malloc(sizeof(LNPtr));
tempnodePtr->data = paraElement;
tempnodePtr->next = NULL;
paraQueuePtr->rear->next = tempnodePtr;
paraQueuePtr->rear = tempnodePtr;
}//入队
int dequ(LQueuePtr paraQueuePtr){
int resultValue;
LNPtr tempnodePtr;
if(paraQueuePtr->front == paraQueuePtr->rear){
printf("队列为空rn");
return -1;
}//队列为空
tempnodePtr = paraQueuePtr->front->next;
resultValue = tempnodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if(paraQueuePtr->rear == tempnodePtr){
paraQueuePtr->rear = paraQueuePtr->front;
}
tempnodePtr = NULL;
return resultValue;
}//出队
测试代码
void testLinkQueue(){
LQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqu(tempQueuePtr, 10);
enqu(tempQueuePtr, 30);
enqu(tempQueuePtr, 50);
outputLQueue(tempQueuePtr);
printf("dequeue gets %drn", dequ(tempQueuePtr));
printf("dequeue gets %drn", dequ(tempQueuePtr));
printf("dequeue gets %drn", dequ(tempQueuePtr));
printf("dequeue gets %drn", dequ(tempQueuePtr));
enqu(tempQueuePtr, 8);
enqu(tempQueuePtr, 9);
enqu(tempQueuePtr, 10);
enqu(tempQueuePtr, 500);
enqu(tempQueuePtr, 600);
enqu(tempQueuePtr, 700);
enqu(tempQueuePtr, -100);
outputLQueue(tempQueuePtr);
}//测试
测试结果



