链表的结构,传递参数 – c

你好,我已经实现了一个链接结构,并用这个列表。

typedef struct link1 { char* a; char* b; int i; struct link1* next; }; 

我从列表中有附加,删除等function。 这些函数获得列表中的第一个链接。 问题是使用函数后信息没有更新。 有没有办法传递第一个链接的参数,以便更新列表? 第一个链接来自类型:

 link1* first; 

**我试图返回第一个链接并且它有效,但我有嵌套函数,我无法在外部函数中返回这些链接,所以我认为唯一的方法是以其他方式传递参数。

现在我发送这样的参数:

 link1* first; func(first); void func(link1* l){...} 

谢谢!

链接列表操作(例如追加,删除等)必须经常影响列表中的“头”节点。 例如,当删除“head”节点时,“head-> next”现在必须将角色视为新的列表头节点。 在这种情况下,你的指针

 link1* first; 

(必须修改指向列表的头节点)以指向“head-> next”节点。 不幸的是,首先传递到这个庄园的一个function

 func(first); 

不允许func()操纵’first’指向的位置。 为了使func()能够操作’first’指向的位置,你必须将first的“address”传递给func():

 func(&first); 

现在,如果func()执行诸如’delete node’或’add node’之类的操作,它将具有’first’的地址,因此它可以改变’first’指向的位置:

 func(struct link1 **first); { ... *first = head->next; ... } 

每当您想使用OUT BYREF参数更改函数中的ANYTHING时,您应该发送指向您正在设置的值的指针。 IE:如果你要设置一个int那么你会传递int * ; 如果您指定的值是struct link1*类型,那么您应该传递指向此类型的指针(指向结构的指针),您可以在其中分配内存并设置调用函数的指针。

 void init(struct link1 **top) { //assign the pointer of the calling function *top = ...; } 

调用function代码

 struct link1 *top; init(&top); 

您的问题是您作为函数中的属性传递,第一个节点的数据而不是第一个节点的数据地址。 在这种情况下,这对我们有何影响? 您在第一个节点上所做的任何更改,只是函数的局部变量中的更改,它们位于程序的堆栈中,当函数返回时,此变量将消失,因此您所做的更改也将消失。

看看这个,你可能会更好地理解它。 想象一下,这是你的ram的快照,灰色单元格是内存索引,白色单元格是相应的数据:

在此处输入图像描述

当你有一个像b这样的变量(让它称之为“单指针”变量)并将b作为属性传递给函数时,实际上传递b(0x1)的数据而不是b(0x3)的地址。 考虑到这一点,您可以注意到您可以更改0x1的内容(例如添加10并使其为’30’)但您无法更改0x3的内容,这是您想要的。

如果您希望能够在不返回内容的情况下从函数更改列表的根,则必须传递地址的地址或“双指针”变量,如c。 像这样传递你能够:

a)更改0x3的数据:* first = ….

b)更改0x1的数据:** first = ….

如果你想检查是否理解它,如果你改变了第一个数据,想想会发生。 例如:

 int **temp = ....; first = temp; 

现在我们提到理论部分,为了遵循我提出的建议,你必须将你的代码改为:

 func(&first); //pass the address of first variable . . func( **first) { // receive with double star . . *first = ...; // change the root using single star . . }