Ошибки в вставке сзади для связанного списка - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать свою библиотеку элементарных операций для связанного списка, но у меня возникают проблемы с функцией push_back(), которая работает: Pu sh данные в конце связанного списка. Вот мой исходный код:

node* push_back(node *dir, item datain)
{
    node *newnode = (node *)malloc(sizeof(node));
    newnode->data = datain;
    newnode->next = NULL;
    if (dir == NULL)
    {
        dir = newnode;
    }
    else
    {
        while (dir->next != NULL)
            dir = dir->next;
        dir->next = newnode;
    }
    return dir;
}
void printlist(node *dir)
{
    printf("%-50s%-50s%-20s\n", "Name", "Email", "Phone number");
    while (dir != NULL)
    {
        item temp = dir->data;
        printf("%-50s%-50s%-20s\n", temp.name, temp.email, temp.phone);
        dir = dir->next;
    }
}
int main()
{
    node *dir = (node *) malloc(sizeof(dir));
    dir = NULL;
    int i = 0;
    while(i<3)
    {
        item temp = userdata();
        dir = push_back(dir, temp);
        i++;
    }
    printlist(dir);
    freelist(dir);
    return 0;
}

Моя проблема: если я просто вставлю 2 записи (каждая запись имеет имя, адрес электронной почты и номер телефона), тогда все в порядке. Однако, если есть более двух записей, поскольку я печатаю целые записи, которые я вставил, он просто распечатывает две последние записи. Я проверил свой код на некоторых сайтах, но обнаружил, что они не похожи на мои. Например:

ВХОД:

Введите имя: Джои

Введите адрес электронной почты: Joey@gmail.com

Введите номер телефона: 0235632514

Введите имя: Мэтью

Введите адрес электронной почты: Mathew@gmail.com

Введите номер телефона: 012502252

Введите имя: Waley

Введите адрес электронной почты: Waley@gmail.com

Введите номер телефона: 036625125

ВЫХОД:

Имя Электронная почта Номер телефона

Мэтью Mathew@gmail.com 012502252

Уэйли Waley@gmail.com 036625125

1 Ответ

2 голосов
/ 09 апреля 2020

Первая проблема:

 node *dir = (node *) malloc(sizeof(dir));
 dir = NULL;

, поэтому у вас есть утечка памяти из-за потери выделения, просто выполните

node *dir = NULL;

Вторая проблема push_back возвращает последний элемент списка, при этом

dir = push_back(dir, temp);

dir теперь указывают на последний элемент, и вы потеряли заголовок списка, поэтому все элементы, кроме последнего

Один из способов - изменить push_back , чтобы он возвращал (новый) заголовок списка:

node* push_back(node * head, item datain)
{
    node *newnode = (node *)malloc(sizeof(node));

    newnode->data = datain;
    newnode->next = NULL;

    if (head == NULL)
        return newnode;

    node * dir = head;

    while (dir->next != NULL)
       dir = dir->next;
    dir->next = newnode;

    return head;
}

, но это предполагает, что вызывающий всегда делает что-то вроде dir = push_back (dir, temp);

другой способ - использовать двойной указатель:

void push_back(node ** head, item datain)
{
    node *newnode = (node *)malloc(sizeof(node));

    newnode->data = datain;
    newnode->next = NULL;

    if (*head == NULL)
        *head = newnode;
    else {
      node * dir = *head;

      while (dir->next != NULL)
         dir = dir->next;
      dir->next = newnode;
    }
}

, и вызывающая сторона может просто сделать push_back (& ​​dir, temp); без риска забыть назначить

...