Связанный список строк в C

Я пытаюсь создать связанный список строк в C, и у меня были проблемы с добавлением первого узла в список. По какой-то причине моя программа печатает NULL, хотя я ссылаюсь на переменную head на newNode, но она не копирует строку из указателя структуры в указатель структуры. Любая помощь приветствуется. Спасибо!

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>

typedef struct stringData {
    char *s;
    struct stringData *next;
} Node;

Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}


void insert(Node *head, Node *newNode) {
    if (head == NULL) {
        head->s = newNode->s;
        head = newNode;
    }
}

void printList(Node *head) {
    while (head != NULL) {
        printf("%s\n", head->s);
        head = head->next;
    }
}



int main()
{
    Node *head = createNode(NULL);

    Node *a = createNode("A");
    insert(head, a);

    printList(head);
    return 0;
}

2 ответа

Следующий фрагмент кода неверен:

void insert(Node *head, Node *newNode) {...}
...
insert(head, a);

Вам нужно передать указатель по ссылке. В настоящее время вы меняете локальную копию (аргумент).

исправлять
Измени свой insert как:

void insert(Node **head, Node *newNode) {...}

И называть как:

insert(&head, a);

Что-то еще
По крайней мере insert (и, возможно,) больше функций не защищены от ошибок (гарантированное разыменование нулевого указателя, else дело не обрабатывается и т. д.). Вам нужно отладить и исправить много таких случаев. Правильная разработка вашего подхода на бумаге до кодирования может помочь.

Вот модифицированная версия кода, которая дает пример вставки новых узлов как в начале списка, так и в конце списка. На самом деле, insert Функция может использоваться для вставки нового узла в любую позицию в списке, так как все, что ей нужно, это указатель на ссылку и указатель на узел, который нужно вставить.

#include <stdlib.h>
#include <stdio.h>

typedef struct stringData {
    char *s;
    struct stringData *next;
} Node;

Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}


void insert(Node **link, Node *newNode) {
    newNode->next = *link;
    *link = newNode;
}

void printList(Node *head) {
    while (head != NULL) {
        printf("%s\n", head->s);
        head = head->next;
    }
}



int main(void)
{
    Node *head = NULL;
    Node *tail = NULL;
    Node *n;

    n = createNode("B");
    // First node at start of list - head is updated.
    insert(&head, n);
    // First node is also the tail.
    tail = n;

    n = createNode("A");
    // Insert node at start of list - head is updated.
    insert(&head, n);

    n = createNode("C");
    // Insert node at end of list.
    insert(&tail->next, n);
    // Update tail.
    tail = n;

    printList(head);
    return 0;
}
Другие вопросы по тегам