1

我正在尝试用 C 语言对链表进行一些操作。我是一个新手,有点对功能感到困惑append()

他们在函数中传递了参数,例如struct node **q. 他们将它与*q.

append()C语言函数:

void append(struct node **q, int num) {
    struct node *temp, *r;
    if(*q==NULL) {
        temp=malloc(sizeof(struct node));
        temp->data=num;
        temp->link=NULL;
        *q=temp;
    }
    else {
        temp=*q;
        while(temp->link!=NULL)
            temp=temp->link;
        r=malloc(sizeof(struct node));
        r->data=num;
        r->link=NULL;
        temp->link=r;
    }
}

我无法理解:-

  1. 为什么他们**q在参数和*q代码部分中使用?
  2. 有什么不同 ?和
  3. 最好的方法是什么?

任何帮助,将不胜感激。

4

4 回答 4

3

请记住,C 中的参数是按值传递的,这意味着它们的值是被复制的。因此,要更改函数中的参数,您必须通过引用传递它。在 C 中,这是通过使用指针来完成的。但是,当传递给函数时,指针本身也是按值传递的,因此为了能够更改该指针,您必须通过引用传递,因此您将它作为指向指针的指针传递。


对于您的特定代码,该函数append修改了您传递给它的指针,因此您需要使用指针的地址通过引用传递它。调用者执行以下操作:

struct node *queue;
append(&queue, ...);

然后当append返回时,q可能会改变。


函数中的使用*q是因为一元运算*符用于取消引用指针。因此,如果您有一个指针q,那么*q将是指向的值q。对于您的函数,因为q是指向指针的指针,所以*q将导致原始指针。

如果使用我上面的简短代码段调用,*q则将返回queue指针。

于 2013-07-22T06:52:30.893 回答
0

这旨在将头指针的地址传递给append().

我很确定, append 会这样调用,

int main()
{

struct node *k;

//calling append() function.
append(&k);

}

参考这里一些简单的例子。http://www.cplusplus.com/forum/general/13227/

于 2013-07-22T06:51:50.540 回答
0

**q 表示 q 是指向另一个指针 p 的指针。如果我想使用 qi 获得 p 的值,则必须使用 **q。*q 将指向 q 中的值,这将是 p 的地址。a * 将再次获得 p 的值。

于 2013-07-22T06:52:19.387 回答
0

你必须很好地理解指针的概念。通常,如果您使用指针,则可以使用* 运算符访问该指针内的值。

前任:

x=10; //Assume Memory Address of x is 1000. 1000 holds value 10
int *y=&x; //Assume Memory address of y is 1100. 1100(y) holds pointer value 1000

这里,

y will hold 1000
*y => value at y => value at 1000 => 10    

让结构看起来像这样。

struct node
{
  int data;
  struct node *link;
}

最初您的队列是空的。

//Initially queue is empty.
struct node *queue=NULL;
append(&queue,10); //append(4000,10);

这里假设队列的地址是4000。

4000 => queue => holds value 0 

所以这里 4000 持有队列的开始。由于队列是空的,它持有 0。

这里我们必须访问 4000 的值来获取第一个节点地址。因此,您将访问指向指针(当前为 0)的指针(4000)。在这种情况下,您正在处理双指针,因此您的声明是 **q

void append(struct node **q, int num)

这里 q 将是 4000,*q => q 处的值是 NULL(Zero)。进入 if 块。

if(*q==NULL) //*q => value at q is NULL(Zero)
{
    temp=malloc(sizeof(struct node)); //assume temp=3000
    temp->data=num; //3000->data=10
    temp->link=NULL; //3000->link=NULL;
    *q=temp; //*q => value at q => value at 4000 is 3000 now.
}

现在再次调用追加

 append(&queue,20); //append(4000,20);
 4000 => queue =>  holds value 3000 //updated address in queue

如果列表不为空,它将在 else 块上工作。

temp=*q; // temp= value at q => 3000
 //Iterate from 3000 to traverse the list and add num in the end.
于 2013-07-22T11:24:27.720 回答