- 对于一个sample,一般来说它具备几个特征,为方便存储,引入不同数据类型的数组难免不便,但是结构体可以方便的解决该问题。比如数据结构中讲到的链表,一个node同时要包含数据(当然可以是一个,也可以是多个)和指向下一个node的地址(内存位置)。我们知道结构体元素的引用有两种方式:
node.value
与node->value
// define a NODE struct variable
NODE nodevar
// define a NODE struct point
NODE *nodepint
两者有怎样的区别呢?区别有两点,如果定义变量过程中定义的是结构体变量,上述nodevar
,那么两种引用方式均可,如果定义的是结构体指针变量,那么只能使用第二仲引用格式node->value
。
-
定义结构体的过程尽量放在头文件中(my.h),后续哪个函数,或者哪个主程序需要使用该结构体,直接在程序中引用该头文件即可
#include “my.h”
。这样方便程序的重复利用,以及多个子程序(或者函数)同时需要使用该结构体。当然,这可能降低了程序的可读性,但是只要习惯了到头文件中找结构体,实际效果是使得程序的结构更加清晰。 -
怎样建立一个单向链表。
首先是定义一个结构体
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
网友评论