在c中链接列表末尾添加节点

时间:2012-03-28 15:39:20

标签: c struct linked-list

我正在尝试将节点添加到链接列表的末尾。我使用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。

3 个答案:

答案 0 :(得分:2)

如果itemNULL,则在调用该函数时,函数后也必定为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,然后在该函数末尾丢失该本地副本。