首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >链表结构,传递参数-c

链表结构,传递参数-c
EN

Stack Overflow用户
提问于 2014-04-29 06:31:47
回答 3查看 280关注 0票数 0

?你好,我已经实现了一个link结构,并用这个做了一个列表。

代码语言:javascript
运行
复制
typedef struct link1 {
  char* a;
  char* b;
  int i;
  struct link1* next;
};

我有从列表中追加、删除等的函数。这些函数获得列表中的第一个链接。问题是在使用这些函数之后,信息没有更新。有没有办法传递第一个链接的参数,这样列表就会被更新?第一个链接来自类型:

代码语言:javascript
运行
复制
link1* first;

**我已经尝试返回第一个链接,但它起作用了,但我有嵌套的函数,并且我不能在外部函数中返回这些链接,所以我认为唯一的方法是以其他方式传递参数。

现在,我像这样发送参数:

代码语言:javascript
运行
复制
link1* first;
func(first);
void func(link1* l){...}

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2014-04-29 06:51:11

链表操作,如追加、删除等,必须经常影响列表中的“头”节点。例如,当" head“节点被删除时,"head->next”现在必须承担新列表head节点的角色。在这种情况下,您的指针

代码语言:javascript
运行
复制
link1* first;

(指向列表的头节点)必须修改为指向" head ->next“节点。不幸的是,首先传递给这个庄园中的一个函数

代码语言:javascript
运行
复制
func(first);

不允许func()操作“first”指向的位置。为了让func()操作' first‘指向的位置,您必须将first的"address“传递给func():

代码语言:javascript
运行
复制
func(&first);

现在,如果func()执行'delete node‘或'add node’这样的操作,它的地址将是'first',因此它可以改变'first‘指向的位置:

代码语言:javascript
运行
复制
func(struct link1 **first);
   {
   ...
   *first = head->next;
   ...
   }
票数 1
EN

Stack Overflow用户

发布于 2014-04-29 06:40:10

当你想使用OUT BYREF参数改变函数中的任何东西时,你应该发送一个指向你正在设置的值的指针。也就是说:如果你要设置一个int,那么你应该传递int *;如果你赋值的值是struct link1*类型的,那么你应该传递一个指向这种类型的指针(指向结构指针的指针),在那里你可以分配内存并设置调用函数的指针。

代码语言:javascript
运行
复制
void init(struct link1 **top)
{
    //assign the pointer of the calling function
    *top = ...;
}

调用函数代码

代码语言:javascript
运行
复制
struct link1 *top;
init(&top);
票数 0
EN

Stack Overflow用户

发布于 2014-04-29 09:43:32

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

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

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

如果你想在不返回任何东西的情况下更改列表的根地址,你必须传递地址的地址,或者“双指针”变量,比如c。像这样传递它,你就能够:

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

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

如果你想检查是否理解它,如果你首先改变数据,就会想要发生。例如:

代码语言:javascript
运行
复制
int **temp = ....;
first = temp;

现在我们已经提到了理论部分,为了遵循我的建议,您必须将您的代码更改为如下所示:

代码语言:javascript
运行
复制
func(&first);    //pass the address of first variable
.
.
func(<variableType> **first) {     // receive with double star
.
.
   *first = ...;                   // change the root using single star
.
.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23352313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档