【数据结构】队列的链式存储

队列的链式存储

  • 队列的链式存储和一般的链表思路不太一样。

代码收获

  • 队列的链式存储是尾插入新节点,头删除节点!!这点和一般思路很不一样,需要注意。
  • 两个结构体初始化的时候别忘记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
空队列
队列空

猜你喜欢

转载自blog.csdn.net/yehuozhili/article/details/83449044