• 栈与队列:链队列算法+可执行代码


    1.队列是只允许在一端进行插入 在另一端进行删除的线性表
    2.队列先进先出
    //队列的链式存储结构(插进去 吐出来) 
    typedef struct QNode
    {
        ElemType data;
        struct QNode *next;
    }QNode, *QueuePrt;
    typedef struct
    {
        QueuePrt front,rear;//队头,尾指针 
    }LinkQuene;
    
    initQueue(LinkQueue *q)  //初始化 
    {
        q->front = q->rear = (QuenuePtr)malloc(sizeof(QNode));
        if(!q->front)
        exit(0);
        q->front->next = NULL;
    }
    
    InsertQueue(LinkQueue *q, ElemType e)  //插入 
    {
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        if(p == NULL);
        exit(0);
        p->data = e;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;  //指向把新插入的结点
    }
    
    DeleteQuenue(LinkQueue *q,ElemType *e)
    {
        QueuePtr p;
        if(q->front == q->rear)  //如果是空队列 返回 
        return;
        p = q->front->next; //让p指向第一个结点 
        *e = p->data;  //用指针获取 
        q->front->next = p->next; //头结点的指针指向第二个结点
        if(q->rear == p) //只有一个元素 因为上面p已经指向第一个结点了 
        q->rear = q->front;
        free(p); 
    }
    
    DestoryQueue(LinkQueue *q)//销毁队列 
    {
        while(q->front)  
        {
            q->rear = q->front->next;//把尾指针指向第一个元素 
            free(q->front);
            q->front = q->rear;
        }
    }
    
    GetHead(LinkQueue q)   //获取头元素 
    {
        if(q.front!=q.rear)
        return q.front->next->data;
    }
    
    
    //链队列可执行代码
    #include<stdio.h>
    #include<stdlib.h>
    
    #define OK 1
    #define ERROR -1
    
    typedef int QElemType;
    typedef int Status;
    typedef int SElemType;
    
    typedef struct QNode
    {
        QElemType data;
        struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct
    {
        QueuePtr front; //队头指针 
        QueuePtr rear;  //队尾指针 
    }LinkQueue;
    
    Status InitQueue(LinkQueue *Q);  //初始化队列 
    Status EnQueue(LinkQueue *Q, QElemType e); //入队列 
    Status DeQueue(LinkQueue *Q, QElemType *e); //出队列 
    SElemType GetHead(LinkQueue Q); //获取队列头元素 
    
    Status InitQueue(LinkQueue *Q)
    {
        Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
        if(Q->front == NULL)
        {
            exit(0);
        }
        Q->front->next = NULL;
        return OK;
    }
    
    Status EnQueue(LinkQueue *Q, QElemType e)
    {
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        if(p == NULL)
        {
            exit(0);
        }    
        p->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = p;
        return OK;
    }
    
    Status DeQueue(LinkQueue *Q, QElemType *e)
    {
        QueuePtr p;
        if(Q->front == Q->rear)  //如果为空 
        {
            return ERROR;
        }
        p = Q->front->next; //让p指向第一个结点
        *e = p->data;
        Q->front->next = p->next;
        if(Q->rear == p)  //如果只剩下最后一个元素 需要调整尾指针的值 
        Q->rear = Q->front;
        free(p); 
        return OK;
    }
    
    SElemType GetHead(LinkQueue Q)
    {
        if(Q.front != Q.rear)
        return Q.front->next->data;
    }
    
    int main(void)
    {
        LinkQueue q;
        int e;
        int heade;
        InitQueue(&q);
        printf("请输入队列元素,用空格隔开,以0结束\n");
        scanf("%d",&e);
        while(e != 0) 
        {
            EnQueue(&q,e);
            scanf("%d",&e);
        }
        printf("链队列的队头元素是: ");
        heade = GetHead(q);
        printf("%d",heade);
        printf("\n");
        while(q.front != q.rear)
        {
            DeQueue(&q,&e);
            printf("%d ",e);
        }
        
        return 0;
    } 
  • 相关阅读:
    Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
    最简单的struts实例介绍
    Spring中bean的五个作用域简介(转载)
    Spring配置文件
    轻松搞定面试中的二叉树题目 (转)
    二叉树
    稳定排序与非稳定排序判别方法
    Yii的缓存机制之动态缓存
    Yii的缓存机制之数据缓存
    Yii的缓存机制之页面缓存
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491322.html
Copyright © 2020-2023  润新知