在c中的链表末尾添加节点



我正试图将一个节点添加到链表的末尾。我使用了一个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);

如果itemNULL,当您调用函数时,它也绑定为函数后面的NULL。C不知道引用参数,它们是由指针"模拟"的。如果要更改函数中的指针,则需要一个指向指针的指针。

这只是一个猜测,因为您实际上并没有显示如何调用此函数。我假设您在part类型的某个地方有一个名为item的指针设置为NULL。然后用那个变量调用这个函数。这实际上并不意味着指向该类型指针的指针。当您执行当前指向NULL的函数调用时,它会创建该指针变量的本地副本。您将该项指针的本地副本设置为temp,然后该本地副本在函数结束时丢失。

相关内容

  • 没有找到相关文章

最新更新