链表初始化的问题,指针问题。

 我来答
新科技17
2022-06-25 · TA获得超过5898个赞
知道小有建树答主
回答量:355
采纳率:100%
帮助的人:74.7万
展开全部

最近学习链表栈队列时候,发现逻辑上来说这几个问题是很容易就搞明白的,但是具体实现尤其是用C语言实现,这个指针参数的传入,有很大的问题,还牵扯到malloc函数的调用的用法,我来一一总结一下。

关于栈链初始化,我们一般来说用以下方法。

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。

我们一定要分清楚,前者是不用二重指针的,因为它有了返回值,而后者需要用二重指针,原因就在于我们需要改变一重指针的下一个节点,也就是改变一重指针的内容,因此我们需要用到指向该一重指针的指针,也就是二重指针,听起来很难理解,但是实际上我们可以把一重指针想象成一个普通变量,我们要在函数里修改该变量并且将其返回主函数,要么是有返回值,要不然就是传入该变量的地址,通过该地址来改变,也即使传入该变量的指针,这么说想必大家就明白了这两种方法的区别。链表初始化的问题也就搞明白了,链表初始化的目的就是我们要新建一个头指针,让其指向为空。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式