核心思路:
1、首先定義隊列結點,包含數據域和指針域;然后定義鏈式隊列,包含隊列節點類型的隊頭和隊尾指針。
2、初始化:
帶頭結點:給頭結點分配內存,然后隊頭和隊尾指針指向頭結點,同時隊頭指針的next指向NULL。
不帶頭結點:隊頭和隊尾指針都指向NULL。
3、入隊:
帶頭結點:先給入隊節點分配內存,然后將新節點插入到隊尾指針后面,新節點的下一個節點為NULL,最后將隊尾指針指向新結點。
不帶頭結點:先給入隊節點分配內存 ,如果隊列為空 ,隊頭和隊尾結點都指向新節點,否則將新節點插入到隊尾指針后面,最后將隊尾指針指向新結點。
4、出隊:
帶頭結點:首先判斷隊列是否為空,然后定義指針p指向隊頭指針的下一個結點,如果這是最后一個結點,則front=rear ,最后釋放p的內存。
不帶頭結點:首先判斷隊列是否為空, 然后定義指針p指向隊頭指針指向的結點,如果這是最后一個結點,則front=NULL,rear=NULL ,最后釋放p的內存。
代碼:
#include<stdio.h>
#include<stdlib.h>//定義
typedef struct LinkNode{ //隊列結點 int data;struct LinkNode *next;
}LinkNode;
typedef struct{ //鏈式隊列 LinkNode *rear,*front;
}LinkQueue;//初始化——帶頭結點
void InitQueue(LinkQueue &Q){Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));Q.front->next=NULL;
} //初始化——不帶頭結點
void InitQueue_(LinkQueue &Q){Q.front=NULL;Q.rear=NULL;
} //入隊——帶頭結點
bool EnQueue(LinkQueue &Q,int x){LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); //給新節點分配內存 s->data=x; s->next=NULL;Q.rear->next=s; //新節點插入到尾指針后面 Q.rear=s; //尾指針指向新插入的結點 return true;
} //入隊——不帶頭結點
bool EnQueue_(LinkQueue &Q,int x){LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); //給新節點分配內存 s->data=x; s->next=NULL;if(Q.front==NULL){Q.front=s;Q.rear=s;} else{Q.rear->next=s; Q.rear=s;}return true;
} //出隊——帶頭結點
bool DeQueue(LinkQueue &Q,int &x){if(Q.front==Q.rear) //首先判斷隊空 return false;LinkNode *p=Q.front->next; x=p->data;Q.front->next=p->next;if(Q.rear==p){ //這是最后一個結點 Q.rear=Q.front; }free(p);return true;
} //出隊——不帶頭結點
bool DeQueue_(LinkQueue &Q,int &x){if(Q.front==NULL) //首先判斷隊空 return false;LinkNode *p=Q.front; //不帶頭結點時頭指針指向隊頭元素 x=p->data;Q.front=p->next;if(Q.rear==p){ //這是最后一個結點 Q.rear=NULL;Q.front=NULL; }free(p);return true;
} //隊列的鏈式存儲一般不會出現隊滿的情況,除非內存不足 int main(){}