go语言初始化链表数据库 golang 链表
链表初始化的问题,指针问题。
最近学习链表栈队列时候,发现逻辑上来说这几个问题是很容易就搞明白的,但是具体实现尤其是用C语言实现,这个指针参数的传入,有很大的问题,还牵扯到malloc函数的调用的用法,我来一一总结一下。
创新互联建站是一家专注于成都网站制作、成都做网站与策划设计,大同网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:大同等地区。大同做网站价格咨询:18982081108
关于栈链初始化,我们一般来说用以下方法。
typedef struct SNode *Stack;
typedef struct SNode{
ElementType Data;
Stack Next;
};
Stack InitStack(){
Stack S = (Stack)malloc(sizeof(struct SNode));
S-Next=NULL;
return S;
}
我们先定义了一个SNode的结构体,是节点,然后我们定义了Stack 是一个指针变量指向了SNode,实际上它就是链表的最开始的头指针,然后我们进行初始化,定义头节点指针为S,这时候我们注意,Stack是一个指针型变量,指向的是结构体,因此,malloc分配函数直接进行强制转化 左边括号就是Stack, 转化成了一种指针类型,我们顺便复习一下malloc的用法,malloc函数分配就是动态的分配内存,右边括号是计算出需要用的字节数,也即是我们申请存放变量的类型字节数,前面的括号里的即是要转化成的指针类型,是属于一种强制类型转化。最后我们定义S的下一个节点是空,这样就可以完成初始化了形成一个空栈。
值得一提的是,malloc申请分配完的内存在使用完毕后需要free,将其释放。
再例如以下初始化。
typedef struct Node
{
StackElementType data;
struct node *next;
} LinkStackNode;
typedef LinkStackNode *LinkStack;
void initStack(LinkStack *L)
{
*L=(LinkStack)malloc(sizeof(Node))
(*L)-next=NULL;
}
这种初始化和上面那种初始化实际上是一样的,虽然看起来有较大差异,同样的,我们定义了一个Node节点的结构体,然后LinkStack是一个指向结构体的指针,我们初始化的参数是一个指向指针的指针L,因此在初始化过程中我们用的是*L,这里的*L是指向头节点的指针变量也即使前一种方法里面的Stack。
我们一定要分清楚,前者是不用二重指针的,因为它有了返回值,而后者需要用二重指针,原因就在于我们需要改变一重指针的下一个节点,也就是改变一重指针的内容,因此我们需要用到指向该一重指针的指针,也就是二重指针,听起来很难理解,但是实际上我们可以把一重指针想象成一个普通变量,我们要在函数里修改该变量并且将其返回主函数,要么是有返回值,要不然就是传入该变量的地址,通过该地址来改变,也即使传入该变量的指针,这么说想必大家就明白了这两种方法的区别。链表初始化的问题也就搞明白了,链表初始化的目的就是我们要新建一个头指针,让其指向为空。
单链表初始化
l-next=0;//先建立一个带头结点的单链表,头结点数据域存储元素个数
改为(*l)-next=0;
l-data=i;改为(*l)-data=i;
l的类型为linklist*,而linklist为lnode*,即为指针的指针。
链表的初始化
1:
因为编译器总是为一个参数创建一个副本h的副本就是_h
使_h = h; 所有你这个函数只是修改了 _h 的值,h指针没有变化(我的解释可能难懂.)
解决方法: 1. 用2级指针。2.用返回: 3.用引用(C++的)
参考资料: 高质量C++编程指南 第7 内存管理 已经说得很明白.
2:
因为链表的头指针就可以代表整个链表.操作都是在头指针(移动头指针就可以找到别的节点)进行的.
文章标题:go语言初始化链表数据库 golang 链表
标题URL:http://myzitong.com/article/dogdipg.html