zoukankan      html  css  js  c++  java
  • 数据结构与动态存储

    1.堆:是程序中用来保存长期使用数据的地方,堆上的数据不会自动清除,因此堆是保存数据结构的绝佳场所(例如链表)

    2.用堆进行动态存储:

      用malloc()申请存储器(相当于储物柜),malloc()返回一个指针

      一旦申请了堆上的空间,这块空间就再也不能被分配出去,直到告诉C标准库已经用完了,堆存储器空间有限,如果在代码中不断申请堆空间,很快就会发生存储器泄露。

      用free()释放存储器

    3.用法:

    #include<stdlib.h>   //为了使用malloc()和free()函数
    mallocsizeof(island));  //表示“给我足够的空间来保存island结构指针” malloc()返回通用指针
    free(p);  //释放

    4.strdup()复制字符串到堆上

    例如:

    char *s = "MONA LISA";
    char *copy = strdup(s);

    注意:栈上的局部变量会被清除,但堆上的不会,所以记得要用free()释放空间

    指针不会建立自己的副本,要用strdup()函数

    数组会建立自己的副本,不用strdup()函数

    5.字符指针不限制字符串的大小

       字符数组需要提前决定字符串长度

    6.valgrind工具:发现存储器泄露

    7.数据结构

    练习

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node
    {
        char *question;
        struct node *no;
        struct node *yes;
    }node;//二叉树
    
    int yes_no(char *question)
    {
        char answer[3];
        printf("%s?(y/n):",question);
        fgets(answer,3,stdin);
        return answer[0] == 'y';
    }
    
    node *create(char *question)//初始化
    {
        node *n = malloc(sizeof(node));
        n->question = strdup(question);
        n->no = NULL;
        n->yes = NULL;
        return n;
    }
    
    void release(node *n)//释放
    {
        if(n)
        {
            if(n->no)
                release(n->no);
            if(n->yes)
                release(n->yes);
            if(n->question)
                free(n->question);
            free(n);
        }
    }
    
    int main()
    {
        char question[80];
        char suspect[20];
        node *start_node = create("Does suspect have a mustache");
        start_node->no = create("Loretta Barnsworth");
        start_node->yes = create("Vinny the Spoon");
    
        node *current;
        do
        {
            current = start_node;
            while(1)
            {
                if(yes_no(current->question))
                {
                    if(current->yes)
                        current = current->yes;
                    else
                    {
                        printf("SUSPECT IDENTIFIED
    ");
                        break;
                    }
                }
                else if(current->no)
                    current = current->no;
                else
                {
                    //Make the yes-node the new suspect name
                    printf("Who's the suspect?");
                    fgets(suspect,20,stdin);
                    node *yes_node = create(suspect);
                    current->yes = yes_node;
    
                    //Make the no-node a copy of this question
                    node *no_node = create(current->question);
                    current->no = no_node;
    
                    //Then replace this question with the new question
                    printf("Give me a question that is TRUE for %s but not for %s?",suspect,current->question);
                    fgets(question,80,stdin);
                    current->question = strdup(question);
    
                    break;
                }
            }
        }while(yes_no("Run again"));
        release(start_node);
        return 0;
    }
  • 相关阅读:
    springmvc 拦截器
    springmvc 文件上传
    springmvc 数据验证 hibernate-validator --->对象验证
    springmvc 类型转换器 数据回显及提示信息
    springmvc框架自带的异常处理器SimpleMappingExceptionResolver的使用
    如何解决JSP页面顶端报错 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    eval函数的使用之一
    【模板】负环判定
    【洛谷P1072】Hankson 的趣味题
    【洛谷P1463】反素数
  • 原文地址:https://www.cnblogs.com/syyy/p/5707161.html
Copyright © 2011-2022 走看看