Vilibb
@Vilibb
Пытаюсь изучить какой-либо ЯП.

Как добавлают несколько узлов в однонаправленных связных списках в си?

Не могу понять, как добавлять узел в список циклом. Интернет копал, то что нашел - не помогло.
Алгоритм у меня сложился примерно такой:
1. Создаю структуру с ссылкой и полем для хранения данных(например тип int)
2. Создаю указатель на структуру.
3. Выделяю память командой malloc.
4. Помещаю данные в поле для данных.
5. Указатель приравниваю к NULL.

При добавлении узла, создаю так же узел, а указатель первого узла устанавливаю на новосозданный.

Собственно я не понимаю в чем динамизм списков, если при создании узла мне надо дать имя узлу. Получается, а что мне нужно заранее знать сколько мне потребуется узлов?
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
"Собственно я не понимаю в чем динамизм списков, если при создании узла мне надо дать имя узлу"
И что за имя?
Суть в следующем.
Для массива - тебе нужно заранее знать, сколько выделить памяти.
Для списка же - ты можешь добавлять элементы на ходу (например - в цикле неизвестной заранее длительности).
Условно:
struct List {
  void* value;
  List* next;
}

List* newList(void* value) {
  List* result = malloc(sizeof(List), 1);
  result->value = value;
  result->next = NULL;
  return result;
}

void main() {
  char* rootValue = "ROOT";
  List* root = newList((void*)rootValue);
  List* list = root;
  while(true) {
    char* value = input();
    if (streq(value, "BREAK")) {
      break;
    }
    list->next = newList((void*) value);
    list = list->next;
  }
  list = root;
  while(list != NULL) {
    printf("%s", (char*)list->value);
    list = list->next;
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы