• 数据结构-单链队列相关操作算法


    程序代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OVERFLOW -2
    #define OK 1
    #define ERROR 0
    
    typedef int QElemType;
    typedef struct QNode {
        QElemType data;
        struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct {
        QueuePtr front;
        QueuePtr rear;
    }LinkQueue;
    
    int InitQueue(LinkQueue *Q);//初始化队列
    int DestoryQueue(LinkQueue *Q);//销毁队列
    int EmptyQueue(LinkQueue *Q);//判断队列是否为空
    int EnQueue(LinkQueue *Q,QElemType e);//插入元素e为Q的新的队尾元素
    int DeQueue(LinkQueue *Q,QElemType *e);//删除非空队列的队头元素,并用e返回删除元素的值
    int ClearQueue(LinkQueue *Q);//清空队列
    int QueueLength(LinkQueue *Q);//取得队列的长度
    int GetHead(LinkQueue *Q,QElemType *e);//取得队头元素
    void visit(QElemType e);//自定义visit函数,表示输出元素的值
    void QueueTraverse(LinkQueue *Q,void *visit(QElemType));//从队头到队尾依次对队列Q中每个元素调用visit函数
    
    //初始化队列
    int InitQueue(LinkQueue *Q) {
        Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
        if(!Q->front) exit(OVERFLOW);
        Q->front->next = NULL;
        Q->rear->next = NULL;
        return OK;
    }
    
    //销毁队列
    int DestoryQueue(LinkQueue *Q) {
        while(Q->front) {
            Q->rear = Q->front->next;
            free(Q->front);
            Q->front = Q->rear;
        }
        return OK;
    }
    
    //判断队列是否为空,为空返回1,不为空返回0
    int EmptyQueue(LinkQueue *Q) {
        if(Q->front == Q->rear) {
            return OK;
        } else {
            return ERROR;
        }
    }
    
    //插入元素e为Q的新的队尾元素
    int EnQueue(LinkQueue *Q,QElemType e) {
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        if(!p) exit(OVERFLOW);
        p->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = p;
        return OK;
    }
    
    //删除非空队列的队头元素,并用e返回删除元素的值
    int DeQueue(LinkQueue *Q,QElemType *e) {
        QueuePtr p;
        if(Q->front == Q->rear) return ERROR;
        p = Q->front->next;
        *e = p->data;
        Q->front->next = p->next;
        if(Q->rear == p) {
            Q->rear = Q->front;
            Q->front->next = NULL;
        }
        free(p);
        return OK;
    }
    
    //清空队列
    int ClearQueue(LinkQueue *Q) {
        QueuePtr p,q;
        if(!EmptyQueue(Q)) {
            p = Q->front->next;
            while(p!=Q->rear) {
                q = p;
                Q->front->next = p->next;
                p = p->next;
                free(q);
            }
            Q->rear = Q->front;
            free(p);
            Q->front->next = NULL;
            Q->rear->next = NULL;
            return OK;
        } else {
            return ERROR;
        }
    
    }
    
    //取得队列的长度
    int QueueLength(LinkQueue *Q) {
        QueuePtr p;
        int i=0;
        p = Q->front;
        while(p!=Q->rear) {
            ++i;
            p = p->next;
        }
        return i;
    }
    
    //取得队头元素
    int GetHead(LinkQueue *Q,QElemType *e) {
        if(!EmptyQueue(Q)) {
            *e = Q->front->next->data;
            return OK;
        } else {
            return ERROR;
        }
    }
    
    //自定义visit函数,表示输出元素的值
    void visit(QElemType e) {
         printf("%d ",e);
     }
    
    //从队头到队尾依次对队列Q中每个元素调用visit函数
    void QueueTraverse(LinkQueue *Q,void *visit(QElemType)) {
        QueuePtr p;
        p = Q->front->next;
        printf("队列中的元素为:");
        while(p) {
            visit(p->data);
            p= p->next;
        }
        printf("
    ");
    }
    
    int main()
    {
        LinkQueue link;
        int f1,f2,f3,f4,f5,f6,e,i,a,len,n;
        //队列初始化
        f1 = InitQueue(&link);
        if(f1) printf("队列初始化成功!
    ");
        else printf("队列初始化失败!
    ");
    
        //入队
        printf("请输入队列中元素的个数:");
        scanf("%d",&n);
        printf("请输入队列中元素的值:");
        for(i=0; i<n; i++) {
            scanf("%d",&a);
            EnQueue(&link,a);
        }
    
        //获取队列长度
        len = QueueLength(&link);
        printf("队列的长度为:%d
    ",len);
    
        //判断队列是否为空
        f2 = EmptyQueue(&link);
        if(f2) printf("队列为空!
    ");
        else printf("队列不为空!
    ");
    
        //遍历队列
        QueueTraverse(&link,&visit);
    
        //出队
        f3 = DeQueue(&link,&e);
        if(f3) printf("删除的队头元素为:%d
    ",e);
        else printf("队列为空!无法删除队头元素!
    ");
    
        //取得队头元素
        f4 = GetHead(&link,&e);
        if(f4) printf("队头元素为:%d
    ",e);
        else printf("队列为空!");
    
        //清空队列
        f6 = ClearQueue(&link);
        if(f6) printf("清空队列成功!
    ");
        else printf("清空队列失败!
    ");
    
        //销毁队列
        f5 = DestoryQueue(&link);
        if(f5) printf("销毁队列成功!
    ");
        else printf("销毁队列失败!
    ");
    
        return 0;
    }
  • 相关阅读:
    ArcGIS Server 10.2 安装教程
    leaflet 使用kriging.js实现前端自定义插值
    气象科普 -降水
    前端开发者如何用JS开发后台
    Spring的简单介绍
    Hibernate与jsp技术结合的小例子
    Servlet_001 我的第一个servlet程序
    Hibernate一级缓存和三种状态
    github提交代码
    MySql索引原理以及查询优化
  • 原文地址:https://www.cnblogs.com/chengzi123/p/4356319.html
Copyright © 2020-2023  润新知