队列的链式存储
- 队列的链式存储和一般的链表思路不太一样。
代码收获
- 队列的链式存储是尾插入新节点,头删除节点!!这点和一般思路很不一样,需要注意。
- 两个结构体初始化的时候别忘记2个都分配节点,并且要传指针地址,不然报空指针异常
exit code -1073741819
错误。 - 队列的出队需要注意要讨论出最后一个元素的情况。
- 队列是有头节点的,并且front始终指向头节点而不是第一个元素!!出队操作是出front后面那个元素。
# include <stdio.h>
# include <stdlib.h>
typedef struct Node{
char data;
struct Node * next;
}node,*nodep;
typedef struct Bag{
nodep front;
nodep rear;
}linklist ,*linklistp;
void Initialquene(linklistp *Q){//初始化
*Q=(linklistp)malloc(sizeof(linklist));
(*Q)->front=(nodep)malloc(sizeof(node));
(*Q)->rear=(*Q)->front;//头指针和尾指针都指向头节点。
(*Q)->front->next=NULL;
}
int Pushquene(linklistp Q){
printf("输入要插入的数据,$结束\n");
int flag =1;
while(flag){
char c;
c=(char)getchar();
if(c!='$'){
nodep newnode;
newnode=(nodep)malloc(sizeof(node));
newnode->data=c;
newnode->next=NULL;//别的节点指向新节点,新节点指向null。
Q->rear->next=newnode;
Q->rear=newnode;
}else{
flag=0;
getchar();
}
}
return 0;
}
int Popquene(linklistp Q){
int flag=1;
while(flag){
printf("是否出队y/n?\n");
char c;
c=(char)getchar();
if(c!='n'){
nodep pre;
if(Q->front==Q->rear){
printf("空队列\n");
return 1;
}else {
char k;
if(Q->front->next==Q->rear){//说明再出一个就空了
Q->rear=Q->front;
pre=NULL;
}
pre = Q->front->next->next;//front始终是头节点 他下一个是要出队的 下下一个是倒数第二个
k=Q->front->next->data;
free(Q->front->next);
Q->front->next= pre;
printf("出队的是%c\n",k);
getchar();
}
} else{
flag=0;
getchar();
}
}
return 0;
}
void Printlist(linklistp Q){
nodep k;
if(Q->front!=Q->rear) {
printf("队列有\n");
for (k = Q->front; k != Q->rear; k = k->next) {
printf("%c", k->next->data);
}
}else{
printf("队列空\n");
}
}
void main(){
linklistp Q;
Initialquene(&Q);
Printlist(Q);
Pushquene(Q);
Printlist(Q);
Popquene(Q);
Printlist(Q);
}
队列空
输入要插入的数据,$结束
213$
213$
队列有
213是否出队y/n?
y
y
出队的是2
是否出队y/n?
y
y
出队的是1
是否出队y/n?
y
y
出队的是3
是否出队y/n?
y
y
空队列
队列空