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

2018-11-10  本文已影响0人  AibWang
  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
上一篇 下一篇

猜你喜欢

热点阅读