• 基本数据结构(C)


    栈:

    #include "stdio.h"
    #include "stdlib.h"
    #define MAX_SIZE 100
    typedef struct stack
    {
        int *base;
        int top;
    }Stack;
    int InitStack(Stack *stack)
    {
        stack->base=(int *)malloc(MAX_SIZE*sizeof(int));
        if(!stack->base) return -1;
        stack->top=0;
        return 1;
    }
    int IsEmpty(Stack *stack)
    {
        if(0==stack->top) return 1;
        return 0;
    }
    int IsFull(Stack *stack)
    {
        if(MAX_SIZE-1==stack->top) return 1;
        return 0;
    }
    int Push(Stack *stack,int e)
    {
        if(!IsFull(stack))
        {
            stack->base[stack->top]=e;stack->top+=1;
            return 1;
        }
        return -1;
    }
    int Pop(Stack *stack)
    {
        if(!IsEmpty(stack))
        {
            stack->top-=1;
            return stack->base[stack->top];
        }
        return -1;
    }
    void main()
    {
        int i=1;
        Stack *stack=(Stack *)malloc(sizeof(Stack));
        if(InitStack(stack))
        {
            while(i<=10)
            {
                Push(stack,i);
                i++;
            }
        }
        printf("栈中元素出栈(先进后出):\n");
        while(!IsEmpty(stack))
        printf("%d\t",Pop(stack));
    }

    队列:

    #include "stdio.h"
    #include "stdlib.h"
    #define MAX_SIZE 10//虽然容量是10,但注意该循环队列只能保存9个整数
    typedef struct queue
    {
        int *base;
        int rear;
        int front;
    }SqQueue;
    //初始化循环队列
    int InitQueue(SqQueue *sqqueue)
    {
       sqqueue->base=(int *)malloc(MAX_SIZE*sizeof(int));
       if(!sqqueue->base)return -1;
       sqqueue->rear=0;
       sqqueue->front=0;
       return 1;
    }
    //入队
    int EnQueue(SqQueue *sqqueue,int e)
    {
        if((sqqueue->rear+1)%MAX_SIZE==sqqueue->front)return -1;
        sqqueue->base[sqqueue->rear]=e;
        sqqueue->rear=(sqqueue->rear+1)%MAX_SIZE;
        return 1;
    }
    //获取对头元素
    int FrontQueue(SqQueue *sqqueue)
    {
        if(Empty(sqqueue))return -1;
        return sqqueue->base[sqqueue->front];
    }
    //出队
    int DeQueue(SqQueue *sqqueue)
    {
        int i=0;
        if(sqqueue->rear==sqqueue->front)return -1;
        i=FrontQueue(sqqueue);
        sqqueue->front=(sqqueue->front+1)%MAX_SIZE;
        return i;
    }
    //判断队列是否为空。注意空和满的条件
    int Empty(SqQueue *sqqueue)
    {
         if(sqqueue->rear==sqqueue->front)
            return 1;
         else
            return 0;
    }
    void main()
    {
        int i=1;
        SqQueue *sqqueue=(SqQueue *)malloc(sizeof(SqQueue));
        if(InitQueue(sqqueue))
        {
            while(i<=10)//最后一次入队失败。因为要损失一个空间存放尾指针
            {
                 EnQueue(sqqueue,i);
                 i++;
            }
    
    
        }
        printf("打印队列元素\n");
        while(!Empty(sqqueue))
            printf("%d\n",DeQueue(sqqueue));
    
    
    }

    败者树:

    #include "stdio.h"
    #define K 8
    #define MINKEY -1//比所有关键字都小的一个值
    #define MAXKEY 1000//比所有关键字都大的一个值
    int b[K];
    void Adjust(int ls[K],int s)//败者树存储在ls[1]~ls[K-1]中,s为记录所在的归并段号
    {
        int t,temp;
        t=(s+K)/2;//t为b[s]的父节点所在败者树中的下标,K是归并段数
        while(t>0)//没有到达树根则继续
        {
            if(b[s]>b[ls[t]]){//与父节点指示的数据进行比较
                temp=s;s=ls[t];//指示胜者,胜者将去参加更上一层比较
                ls[t]=temp;//ls[t]记录败者所在的段号
            }
            t=t/2;//向树根回退一层
        }
        ls[0]=s;//ls[0]记录本趟最小关键字所在的短号
    }
    int Get_next(int i)
    {
    
    
    }
    void K_merger(int ls[K])
    /*ls[0]~ls[K-1]是败者树的内部节点。b[0]~b[K-1]分别存储K个初始归并段的当前记录*/
    /*函数Get_next(i)从第i个归并段读取并返回当前记录,若归并段为空,则返回MAXKEY*/
    {
        int b[K+1],i,q;
        for(i=0;i<K;i++)
            b[i]=Get_next(i);//分别读取K个归并段的第一个关键字
        b[K]=MINKEY;
        for(i=0;i<K;++i)ls[i]=K;//创建败者树,设置ls中败者的初值。
        for(i=K-1;i>=0;--i)//依次从b[K-1],b[K-1]..b[0]出发调整败者树。
            Adjust(ls,i);
        while(b[ls[0]]!=MAXKEY)//ls[0]记录本趟最小关键字所在的段号
        {
            q=ls[0];//q是当前最小关键字的所在的归并段。
            printf("%d",b[q]);
            b[q]=Get_next(q);
            Adjust(ls,q);
        }
    }
  • 相关阅读:
    Tomcat 配置用户认证服务供C#客户端调用
    Solr与HBase架构设计
    一个自定义MVP .net框架 AngelFrame
    Dell R720上的系统安装问题的解决办法(关于RAID建立磁盘阵列的技术)
    中文分词器性能比较
    关于RabbitMQ关键性问题的总结
    js基本类型与引用类型,浅拷贝和深拷贝
    sass初学入门笔记(一)
    Emmet插件比较实用常用的写法
    今天发现新大陆:haml和Emmet
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2834775.html
Copyright © 2020-2023  润新知