Связанный список строк в 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;
}