Добавить узел в конце связанного списка в c - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь добавить узел в конец связанного списка. Я использую функцию void и передаю свою структуру в нее, но как только она прошла через функцию добавления, моя структура все еще пуста. вот код.

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);
    }
} 
Элемент

равен нулю, когда он изначально передается в функцию, но по какой-то причине получается нулевым, даже если у меня есть оператор if, который устанавливает элемент равным temp1.

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Вам нужно изменить значение указателя, поэтому вам необходим дополнительный уровень косвенности:

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 голосов
/ 28 марта 2012

Если item равно NULL, то при вызове функции она обязательно будет NULL также после функции. Си не знает эталонный параметр, они «симулируются» указателями. Если вы хотите изменить указатель внутри функции, вам нужен указатель на указатель.

0 голосов
/ 28 марта 2012

Это только предположение, поскольку вы на самом деле не показали, как вы вызываете эту функцию.Я предполагаю, что у вас есть указатель с именем item где-то типа part установлен в NULL.Затем вы вызываете эту функцию с этой переменной.На самом деле это не означает указатель на указатель этого типа.Он создает локальную копию этой переменной указателя при выполнении этого вызова функции, который в данный момент указывает на NULL.Вы устанавливаете локальную копию указателя этого элемента на temp, а затем эта локальная копия теряется в конце функции.

...