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

如题所述

第1个回答  2022-06-25

最近学习链表栈队列时候,发现逻辑上来说这几个问题是很容易就搞明白的,但是具体实现尤其是用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。

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

链表初始化的问题,指针问题。
链表初始化的问题也就搞明白了,链表初始化的目的就是我们要新建一个头指针,让其指向为空。

关于链表初始化的问题
\/\/初始化头结点(第0个节点)if ( NULL==(phead = (pNode)malloc(sizeof(Node))) ){ printf("memory overflow!\\n");} phead->num = 0;\/\/编号为0 phead->next = NULL;\/\/next指向空指针 \/\/初始化其他节点 InitList( phead );\/\/显示最终建成的链表 temp = phead;\/\/中间变量指针指...

关于链表指针的问题
首先,要分清楚这里面有两种类型,一种是listnode,它表示链表的节点,另一种是listnode *,它表示指向链表节点的指针,同时又定义listpointer表示listnode *这种类型。至于insert函数中,为什么first的类型是listpointer *,也就是listnode **,指向链表节点的指针的指针,这是因为,在插入的过程中,我们需要...

新手求助关于c程序中链表初始化的问题
node *head=NULL, *p; \/\/head是整个链表的头指针; P是定义一个指针 for(int i=0; i<n; ++i){ node *nd = new node(); \/\/这个结构体会出现在heap上 nd->data = a[i];if(i==0){ head = p = nd; \/\/先p=nd,再head=p continue;} p->next = nd;p = nd; \/\/p指向当...

数据结构-单链表的初始化操作问题
问题1:这里初始化函数的参数为什么要这样定义LinkList *head,如果要定义成LinkList head可行么?为什么!!!答:LinkList head;只定义了一个简单指针变量 LinkList *head;定义了一个双重指针,如果要通过函数返回"指针"的值,得定义双重指针;所以你的想法不行.问题2:这里 exit(-1);语句能帮忙解释一...

数据结构单链表初始化问题
LinkList 定义的变量是指针类型的变量啊,在第一种方法中,函数类型是LinkList 类型,所以,不需加&,第二种,你的函数定义应为:int InitList(LinkList *first)才对,不然不能返回正确的值,这时调用是通过实参返回结果,所以参数为指针类型才行。在主函数中调用时,因为LinkList first;所以调用时要...

关于C语言数据结构单链表初始化的问题
} void main(){ x=1; y=2;fun(x, y);...\/\/此时仍然x=1; y=2;} 但是,函数写成如下形式 void InitList(LinkList *head);可以实现引用传递参数的功能。在需要函数内部修改链表头指针时,用该形式可以解决该问题。而void InitList(LinkList head) 不可以在函数内部修改链表头指针。

关于单链表中指针的问题。
创建单链表的步骤如下:malloc一个node,作为链表的第一个节点同时作为单链表的头 初始化刚刚申请的node的next指针,让其指向空NULL malloc第二个node,并将第一个node的next指针,指向第二个node 初始化第二个node的next指针,让其指向空NULL 重复3~5步骤,直到满足链表node数量。

C语言链表初始化。下面这样不可以吗
头结点初始化有两种方法:一个是返回指针地址,另一个是传址 方法一:返回指针(创建链表中,这种方法比较常用)linklist *init_list(linklist *l)\/\/这里是指针函数,带参数 { l = (linklist *) malloc (sizeof(linklist));l->next=NULL;return I;\/\/要加上这句返回指针 } 主函数调用形式为...

双向循环链表(1): 链表的初始化
初始化链表有多种方式。首先,让我们从展开宏LIST_HEAD_INIT开始。它实际等同于构造了一个list1对象,其中prev和next成员均指向list1本身。想象一下,整个节点就是list1,且其前后指针均指向自身。直观的表示方式如图所示,整个节点作为环,前后指针形成闭环。接下来,我们使用测试方法来验证上述推测。通过...

相似回答
大家正在搜