【问题标题】:struct of linked list, passing paramters - c链表的结构,传递参数 - c
【发布时间】:2014-05-07 20:38:50
【问题描述】:

?你好, 我已经实现了一个链接结构,并以此制作了一个列表。

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

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

link1* first;

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

现在我这样发送参数:

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

谢谢!

【问题讨论】:

  • 请澄清,你的意思是你不能改变第一个指针?
  • 我更改了从“第一个”链接开始的列表,但仅在函数中。函数完成后,没有保存任何更改。
  • 您需要让您的函数接受一个指向list * 的指针,即list **,然后将&first 传递给它,然后您可以修改它指向的内容。跨度>
  • 只是观察,问题中定义的typedef似乎不完整,在声明结构后缺少typedef名称。

标签: c


【解决方案1】:

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

link1* first;

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

func(first);

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

func(&first);

现在,如果 func() 执行诸如“删除节点”或“添加节点”之类的操作,它将具有“第一个”的地址,从而可以更改“第一个”指向的位置:

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

【讨论】:

  • 谢谢!很好的解释!
【解决方案2】:

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

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

调用函数代码

struct link1 *top;
init(&top);

【讨论】:

  • 谢谢!很有帮助!
【解决方案3】:

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

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

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

如果您希望能够从函数更改列表的根而不返回任何内容,则必须传递地址的地址,或“双指针”变量,如 c。像这样通过它,您可以:

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

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

如果你想检查是否理解它,认为如果你改变 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
.
.
}

【讨论】:

  • 我很高兴能帮上忙。考虑支持任何有用的答案并接受其中最有帮助的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2021-12-10
  • 1970-01-01
  • 2012-01-04
  • 2014-12-15
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多