链式队列

warning: 这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
#include<stdio.h>
#include<stdlib.h>
#define queuesize 128
struct Node{
    int data;//数据域
    struct Node* next;//队列指针域
};//节点定义
 
struct Queue{
    Node* first;//指向首节点
    Node* last;//指向尾节点
    int size;
};//队列定义
 
Node* initnode(int value){
    Node* newnode=(Node*)malloc(sizeof(Node));
    newnode->data=value;
    newnode->next=NULL;
    return newnode;
}//初始化节点
 
Queue* initqueue(){
    Queue* Q=(Queue*)malloc(sizeof(Queue));
    Q->first=NULL;
    Q->last=NULL;
    Q->size=0;
    return Q;
}//初始化队列
 
int isfull(Queue* Q){
    return (Q->size==queuesize);
}//判断队列是否已满
 
int isempty(Queue* Q){
    return (Q->first==NULL);
}//判断队列是否已空
 
void printqueue(Queue* Q){
    if(isempty(Q)){
        printf("当前队列为空\n");
        return;
    }
    else{
        Node* qmove=Q->first;//初始化游标为队首
        while(qmove!=NULL){
            printf("%d ",qmove->data);
            qmove=qmove->next;
        }
        printf("\n");
    }
}//正序打印队列
 
void pushqueue(Queue* Q){
    int value;
    printf("请输入需入队元素值为:");
    scanf("%d",&value);
    Node* newnode=initnode(value);//初始化创建节点
    if(isfull(Q)){
        printf("队列已满,请删除元素\n");
        return;
    }
    else{
        if(isempty(Q)){//队列为空
            Q->first=newnode;//队首设置为该节点
            Q->last=newnode;//队尾设置为该节点
        }
        else{//尾插法插入节点
            Q->last->next=newnode;//原队尾的next指针指向新节点
            Q->last=newnode;//队尾设置为新结点
        }
        Q->size++;
    }
}//队列尾插元素
 
void popqueue(Queue* Q){
    if(isempty(Q)){
        printf("当前队列为空,无法进行删除\n");
        return;
    }
    else{
        Node* oldnode=Q->first;//缓存队首地址
        Q->first=Q->first->next;//队首设置为原首节点next指针指向的下一个节点
        free(oldnode);//释放原队首
        Q->size--;
    }
}//队列头删元素
 
void returnlen(Queue* Q){
    printf("当前队列长度为%d\n",Q->size);
}//返回队列长度
 
void searchqueue(Queue* Q){
    if(isempty(Q)){
        printf("当前队列为空\n");
        return;
    }
    else{
        int value,index=1;
        printf("请输入需查询元素值为:");
        scanf("%d",&value);
        Node* qmove=Q->first;
        while(qmove!=NULL){
            if(qmove->data==value){
                printf("查询成功,位置为%d\n",index);
                return;
            }
            index++;
            qmove=qmove->next;
        }
    }
    printf("查询失败,队列中无该元素\n");
}//查询队列中元素
 
void clearqueue(Queue* Q){
    if(isempty(Q))
        free(Q);
    else{
        Node* node=Q->first;//缓存队首地址
        Node* qmove=Q->first;
        while(qmove!=NULL){
            node=qmove;
            qmove=qmove->next;
            free(node);
        }
        free(Q);
    }
    printf("队列已清空销毁,将自动结束程序\n");
    exit(0);
}//清空队列
 
void queuemenu(){
    printf("1.正序打印队列\n");
    printf("2.元素入队\n");
    printf("3.元素出队\n");
    printf("4.返回队列长度\n");
    printf("5.根据值查询元素位置\n");
    printf("6.清空队列\n");
    printf("0.退出程序\n");
}//队列功能菜单
 
void endsystem(Queue* Q){
    clearqueue(Q);
    exit(0);
}//结束程序
 
int main(){
    Queue* Q=initqueue();//初始化创建栈
    int sort,flag=1;
    while(flag){
        queuemenu();
        printf("请输入数字选择功能:");
        scanf("%d",&sort);
        switch(sort){
            case 1:{
                printqueue(Q);
                break;
            }
            case 2:{
                pushqueue(Q);
                break;
            }
            case 3:{
                popqueue(Q);
                break;
            }
            case 4:{
                returnlen(Q);
                break;
            }
            case 5:{
                searchqueue(Q);
                break;
            }
            case 6:{
                clearqueue(Q);
                break;
            }
            case 0:{
                endsystem(Q);
                break;
            }
        }
        printf("\n");
    }
}
none
最后修改于:2023年11月25日 18:30

评论已关闭