我正在尝试将节点添加到链接列表的末尾。我使用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 failed\n");
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%.2f\n%d\n", 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%.2f\n%d\n", item->name, item->price, item->quantity);
}
}
item在最初传递给函数时为null,但由于某种原因,即使我有if语句将item设置为temp1,也会出现null。
答案 0 :(得分:2)
如果item
为NULL
,则在调用该函数时,函数后也必定为NULL
。 C不知道参考参数,它们是"模拟"通过指针。如果要更改函数内的指针,则需要指向指针的指针。
答案 1 :(得分:2)
您需要修改指针的值,因此需要额外的间接级别:
void addEnd(partType **item)
{
...
temp2 = *item;
...
if (*item == NULL)
{
*item = temp1;
(*item)->next = NULL;
printf("%s%.2f\n%d\n", (*item)->name, (*item)->price, (*item)->quantity);
...
}
你会把它称为
partType *newItem;
...
addEnd(&newItem);
答案 2 :(得分:0)
这只是猜测,因为你实际上没有显示你如何调用这个函数。我假设你有一个名为item的指针,其类型部分设置为NULL。然后使用该变量调用此函数。这实际上并不意味着指向该类型指针的指针。当您执行该函数调用时,它会创建该指针变量的本地副本,该函数调用当前指向NULL。您将该项目指针的本地副本设置为temp,然后在该函数末尾丢失该本地副本。