美文网首页
关于C语言中结构体的几个问题

关于C语言中结构体的几个问题

作者: AibWang | 来源:发表于2018-11-10 10:59 被阅读0次
    1. 对于一个sample,一般来说它具备几个特征,为方便存储,引入不同数据类型的数组难免不便,但是结构体可以方便的解决该问题。比如数据结构中讲到的链表,一个node同时要包含数据(当然可以是一个,也可以是多个)和指向下一个node的地址(内存位置)。我们知道结构体元素的引用有两种方式:
      node.valuenode->value
    // define a NODE struct variable
    NODE nodevar
    // define a NODE struct point
    NODE *nodepint
    

    两者有怎样的区别呢?区别有两点,如果定义变量过程中定义的是结构体变量,上述nodevar,那么两种引用方式均可,如果定义的是结构体指针变量,那么只能使用第二仲引用格式node->value

    1. 定义结构体的过程尽量放在头文件中(my.h),后续哪个函数,或者哪个主程序需要使用该结构体,直接在程序中引用该头文件即可#include “my.h”。这样方便程序的重复利用,以及多个子程序(或者函数)同时需要使用该结构体。当然,这可能降低了程序的可读性,但是只要习惯了到头文件中找结构体,实际效果是使得程序的结构更加清晰。

    2. 怎样建立一个单向链表。
      首先是定义一个结构体

    typedef struct linkNode{
            float value;
            int flag;
            struct linkNode *next;
    } Node;
    

    然后我们就可以写一个创建链表的函数了:

    Node * creatlist(float *data, int n){
        Node *head, *tail;
        int ii;
        Node *node1;
        //
        if(n<1) { return(NULL); }
        head = (Node *)malloc(sizeof(Node));
        head->flag = 1;
        head->value = 0;
        tail = head;
        for(ii=0;ii<n;ii++){
            node1 = (Node *)malloc(sizeof(Node));
            node1->value = data[ii];
            tail->next = node1;
            tail = node1;
        }
        tail->next = NULL;// the tail of list
        //return
        return(head);
        }
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    在创建链表的过程中,每个新增节点的过程中,我们都使用了malloc函数,为什么不直接定义一个结构体变量node1,而是采取每次开辟一个存放结构体的内存空间呢?刚开始我没想明白,其实问题就在于内存空间,如果定义的是一个结构体变量,那么该变量的内存空间在编译时分配,每次将上一个节点指向下一个节点(内存位置)end->next = node1,实际上都是指向它自身,也就是没有增加链表的长度,而是不断覆盖原节点的元素。
    这么来看,我们可以采取另一种方式来开辟内存空间,直接定义一个结构体数组,而不是每新增一个节点,开辟一次内存空间。这种方式开辟的内存空间是连续的一个block。

    head = (Node *)malloc(sizeof(Node)*n);
        head->flag = 1;
        tail = head;
        for(int i=0;i<n;i++){
            tail->value = data[i];
            tail->next = &head[i];
            tail = &head[i];
        }
        tail->next = NULL;// the tail of list
    

    相关文章

      网友评论

          本文标题:关于C语言中结构体的几个问题

          本文链接:https://www.haomeiwen.com/subject/xxhzxqtx.html