Создание связанного списка, который хранит размер списка - PullRequest
0 голосов
/ 19 августа 2011

Мне нужно сделать связанный список, в котором хранятся целочисленные данные.Также списку нужно знать его размер (количество элементов в списке).

Это мой код.

файл related.h

typedef struct node Node;
struct node{
int a;
Node* b;
};
Node m;

typedef struct {
node* head;
int size;
}list;
list list1;

Основной файл

#include <stdio.h>
#include "linked.h"
list init(list list1)
{
  list1.head = null;
  list1.size = 0;
  return list1;
}

void main()
{
list1=init(list1);
printf("%d",list1.size);
}

Теперь при запуске результат - «не удалось создать процесс» с использованием Turbo C в Windows.

  • Почему я получаю этот результат?
  • Почему процесс не создается?
  • Кроме того, это как я должен инициализировать связанный список?

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Есть две ошибки: во-первых, вы должны написать Node* head; вместо node* head;, а во-вторых, вы должны написать NULL или 0 вместо null.

Возможно, ваш компиляторсообщения как-то подавляются.

И, да, именно так вы можете инициировать связанный список, но

list init(void)
{
    list list1;
    list1.head = null;
    list1.size = 0;
    return list1;
}

было бы лучше.

И это можно было бы сделатьа также другие улучшения.

0 голосов
/ 19 августа 2011

Ваш заголовок не должен определять list list1;, хотя он может объявить его extern list list1;. Однако, чтобы его можно было повторно использовать, заголовок не должен объявлять переменные. (См. Что такое внешние переменные в C .)

В вашем заголовке должна быть защита от множественного включения. (См. Должен ли я использовать #include в заголовках .)

Ваш заголовок должен объявлять функции, которые предоставляются для управления списками.

У вас должен быть файл реализации, который реализует функции управления списком (linked.c будет соответствовать имени заголовка linked.h). Основная программа тогда просто использовала бы эти функции.

Ваша main() программа обычно должна иметь тип возврата int; это требуется стандартом C. Ваш компилятор может иметь альтернативу.

Было бы неплохо, если бы ваши типы были заглавными, вместо использования Node и list.

Ваша функция init() имеет неправильное название. Это также плохо разработано. Вам не нужно ни входное значение, ни возвращаемое значение. Ваш код обрабатывает переданную структуру как удобно расположенную локальную переменную, инициализирует ее и копирует обратно; это будет работать также без аргументов и list list1;, определенная как локальная переменная. И вам, вероятно, следует избегать использования того же имени, что и у глобальной переменной в списке аргументов (или в качестве локальной переменной). Компилятор не смущен этим; Вы, вероятно, Было бы более привычно использовать:

static void list_init(list *new_list)
{
    new_list->head = 0;
    new_list->size = 0;
}

и

list_init(&list1);

Учитывая все вышесказанное, все еще нет очевидной причины, по которой ваша программа не будет работать.

Одна странная возможность состоит в том, что ваша init() функция сбивает с толку среду выполнения, которая обычно запускает свою собственную функцию init(), и ваша инициализация не выполняет то, что ожидает компилятор.

В противном случае, вы можете компилировать и запускать какие-либо программы - программу «Hello World»? Если вы можете компилировать и запускать программы в целом, то в вашей программе есть что-то, что вредит системе - и функция init() занимает центральное место. Если вы не можете запустить простую «Hello Program», вам необходимо исправить установку компилятора в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...