我正在尝试对链接列表进行排序。我对何时使用struct node*head
以及何时使用struct node **head
感到困惑,可以使用它们来完成实现。
我应该何时使用:
void sortedinsert(struct node **head)
我应该何时使用:
void sortedinsert(struct node *head)
答案 0 :(得分:9)
使用此功能签名:
void changeNode(struct node *head)
您有一个指向该节点的指针,因此您可以更改该结构。您无法更改变量head 指向的内容。我们假设struct node
的以下定义:
struct node
{
int field1;
struct node *next;
}
使用给定的函数签名和struct node
,请考虑以下操作可以更改函数中的结构:
void changeNode(struct node *head)
{
head->field1 = 7;
head->next = malloc(sizeof(struct node));
}
C是按值传递:当我们将变量传递给函数时,函数会获得副本。这就是为什么我们将指针传递给struct node
,以便我们可以更改它,并在函数外部具有这些更改的效果。但是我们仍然只获得指针本身的副本。因此以下操作无用:
void changeNode(struct node *head)
{
// we're only changing the copy here
head = malloc(sizeof(struct node));
}
head
的更改不会反映在该功能之外。为了改变head
指向的内容,我们必须使用额外的间接级别:
void changeNode(struct node **head)
{
// now we're changing head
*head = malloc(sizeof(struct node));
// alternately, we could also do this:
*head = NULL;
}
现在,head
的更改会反映在 函数之外。
答案 1 :(得分:2)
如果head总是指向链接列表的头部(一个常量位置),那么使用struct node * head 如果您打算更改头部使用节点** head
指向的位置答案 2 :(得分:1)
struct node **head
您正在传递head
指针的地址,使其可以引用/指向不同的内存区域。使用struct node *head
,您无法将head
修改为指向其他任何位置
答案 3 :(得分:0)
第一个是指向节点的指针,它是一个结构。
(struct node *) head;
将head
定义为可以存储node
的地址的变量。
这允许在方法中通过引用传递node
。
第二个是指向节点指针的指针,该节点是一个结构。
(struct node **) head;
将head
定义为变量,它可以存储另一个变量的地址,该变量的地址为node
。
这允许在方法中通过引用传递node *
。
答案 4 :(得分:0)
node*
是指向节点结构的指针。 node**
是指向节点结构的指针。如果要通过引用修改指针,则在C中使用指针指针。
假设您要在节点B上执行操作,该操作可能会使用不同的节点替换节点B.一种做事方式是
nodeA.next = foo(nodeA.next);
另一个选择就是
foo(&nodeA.next);
让foo隐式替换nodeA.next
指针。
答案 5 :(得分:0)
在此示例中,由于head的值可能会在创建时发生变化(它可能指向与当前节点不同的某些其他节点),
你应该使用,
void sortedinsert(struct node **head)
因为您的头部可能需要修改。
看来,下面的原型需要改变,
void sortedinsert(struct node *head)
因为这不允许你修改头部,所以应该是这种情况(如果你使用的话),
struct node * sortedinsert(struct node *head)
返回更新的头部,可以在此函数的调用者中使用。
答案 6 :(得分:0)
运行或阅读此内容您可以看到它
#include <stdio.h>
struct node{
int one;
int two;
struct node * next;
//char location[100];
};
void changeHead(struct node** head){
}
void sort(struct node* head){
}
int main(){
struct node* head = (struct node*) (malloc (sizeof(struct node)));
// now head pointing to a node stucture ( if you dereferance head you get teh first value)
struct node* tmp = head;
struct node** newHead = (struct node**) (malloc (sizeof(struct node*)));
//New head points to a 'struct node*', which hold an addtess of another struct node
head->one = 12;//*head->one =12; //head.one = 12 is wrong cos it is holding an address.
// you can do it but it doesnt make sence since you dont know whats on address #12
// now if you want head to point to old head which is on tmp at the moment
*newHead = head;
// now if you working with 2 linked list and you want to change the heads use below
changeHead(newHead);
// if you want to just sort its better and easy to use
sort(head);
//chack whats on head and newhead
printf("double derefence newHead:%d\n",**newHead);
printf("derefence newHead(its and address same ad address of head):%d\n",*newHead);
printf("Head(its and address):%d\n",head);
printf("derefence Head:%d\n",*head);//head->one works too
}
答案 7 :(得分:0)
简单来说,当您想要更改“head”指向的位置时,请使用**head
,否则请使用*head
,但不允许更改位置。
答案 8 :(得分:0)
(&head)
来调用
函数(因此您已声明指向指针变量的指针
在函数(struct node**head)
中,因为它接收的地址
head
这只是指向第一个节点的指针。(*head)
。答案 9 :(得分:0)
情况1:使用时:
void sortedinsert(struct node **head)
在功能内您将实际上正在修改 head
指针,因为很有可能您将在内部使用*head
。 sortedinsert
很可能会用参数&head
来调用。
情况2:使用时:
void sortedinsert(struct node *head)
在函数内部,您将修改head
指针的副本,因为很有可能您将在内部使用head
变量。 sortedinsert
很可能会用参数head
来调用。