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

时间:2014-04-28 22:31:47

标签: c

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

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

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

link1* first;

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

现在我发送这样的参数:

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

谢谢!

3 个答案:

答案 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的快照,灰色单元格是内存索引,白色单元格是相应的数据:

enter image description here

当你有一个像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
.
.
}