?您好, 我已经实现了一个链接结构,并用这个列表。
typedef struct link1 {
char* a;
char* b;
int i;
struct link1* next;
};
我从列表中有附加,删除等功能。这些函数获取列表中的第一个链接。问题是使用信息后没有更新的功能。 有没有办法传递第一个链接的参数,这样列表将被更新? 第一个链接来自类型:
link1* first;
**我试图返回第一个链接并且它有效,但我有嵌套函数,我无法在外部函数中返回这些链接,所以我认为唯一的方法是传递参数其他方式。
现在我发送这样的参数:
link1* first;
func(first);
void func(link1* l){...}
谢谢!
答案 0 :(得分:1)
链接列表操作(例如追加,删除等)必须经常影响" head"列表中的节点。例如,当" head"节点被删除,然后" head-> next"现在必须将角色视为新的列表头节点。在这种情况下,你的指针
link1* first;
必须修改(指向列表的头节点)以指向" head-> next"节点。不幸的是,首先传递给这个庄园的一个功能
func(first);
不允许func()操纵首先'指着。为了让func()能够操纵第一个'指着,你必须通过"地址"第一个到func():
func(&first);
现在,如果func()执行诸如删除节点'之类的操作。或者'添加节点',它将具有' first'的地址,从而它可以改变第一个'指着:
func(struct link1 **first);
{
...
*first = head->next;
...
}
答案 1 :(得分:0)
每当您想使用OUT
BYREF
参数更改函数中的ANYTHING时,您应该发送指向您正在设置的值的指针。 I.E:如果您要设置int
,那么您将通过int *
;如果您指定的值是struct link1*
类型,则应该传递指向此类型的指针(指向结构的指针),您可以在其中分配内存并设置调用函数的指针。
void init(struct link1 **top)
{
//assign the pointer of the calling function
*top = ...;
}
调用功能代码
struct link1 *top;
init(&top);
答案 2 :(得分:0)
您的问题是您在函数中传递了属性,第一个节点的数据而不是第一个节点的数据地址。在这种情况下,这对我们有何影响?您在第一个节点上所做的任何更改,只是函数的局部变量中的更改,这些变量位于程序的堆栈中,当函数返回时,此变量将会消失,因此您所做的更改将会消失。
检查一下,你可能会更好地理解它。想象一下,这是你的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(<variableType> **first) { // receive with double star
.
.
*first = ...; // change the root using single star
.
.
}