我正试图将一个节点添加到链表的末尾。我使用了一个void函数并将我的结构传递给它,但一旦它运行完add函数,我的结构仍然是空的。这是代码。
struct part {
char* name;
float price;
int quantity;
struct part *next;
};
typedef struct part partType;
void addEnd(partType *item) {
partType *temp1=NULL, *temp2=NULL;
char temp[100];
temp1 = (struct part *)malloc(sizeof(partType));
if (!temp1)
printf("malloc failedn");
temp1->name = malloc(sizeof(char)*100);
printf("Please enter item name: n");
fgets(temp, 100, stdin);
strcpy(temp1->name, temp);
printf("Please enter item price: n");
fgets(temp, 100, stdin);
sscanf(temp, "%f", &temp1->price);
printf("Please enter item quantity: n");
fgets(temp, 100, stdin);
sscanf(temp, "%d", &temp1->quantity);
// Copying the Head location into another node.
temp2 = item;
if (item == NULL) {
// If List is empty we create First Node.
item = temp1;
item->next = NULL;
printf("%s%.2fn%dn", item->name, item->price, item->quantity);
} else {
// Traverse down to end of the list.
while (temp2->next != NULL)
temp2 = temp2->next;
// Append at the end of the list.
temp1->next = NULL;
temp2->next = temp1;
printf("%s%.2fn%dn", item->name, item->price, item->quantity);
}
}
当item最初被传递到函数中时,它是null,但由于某种原因,即使我有将item设置为temp1的if语句,它也会变成null。
您需要修改指针的值,因此您需要一个额外的间接级别:
void addEnd(partType **item)
{
...
temp2 = *item;
...
if (*item == NULL)
{
*item = temp1;
(*item)->next = NULL;
printf("%s%.2fn%dn", (*item)->name, (*item)->price, (*item)->quantity);
...
}
你会称之为
partType *newItem;
...
addEnd(&newItem);
如果item
是NULL
,当您调用函数时,它也绑定为函数后面的NULL
。C不知道引用参数,它们是由指针"模拟"的。如果要更改函数中的指针,则需要一个指向指针的指针。
这只是一个猜测,因为您实际上并没有显示如何调用此函数。我假设您在part类型的某个地方有一个名为item的指针设置为NULL。然后用那个变量调用这个函数。这实际上并不意味着指向该类型指针的指针。当您执行当前指向NULL的函数调用时,它会创建该指针变量的本地副本。您将该项指针的本地副本设置为temp,然后该本地副本在函数结束时丢失。