Узел, имеющий себя в своем списке смежности - PullRequest
0 голосов
/ 14 декабря 2011
typedef struct vertex{
    int num;
    struct vertex *next;
} Vertex;

Vertex *adj[1];

void buildList(){
    Vertex *v=NULL;
    Vertex *t=NULL;

    v = malloc(1*sizeof(*v));
    v->num = 1;
    adj[0] = v;  //a NODE with value 1
    t = v;

    v = malloc(1*sizeof(*v));
    v->num = 1;
    t->next = v; // and ANOTHER NODE but it should be the SAME NODE with the above one
    t = v;


    //v = malloc(1*sizeof(*v));
    //v->num = 1;
    //t->next = adj[0]; // causes infinite loop...
    //t = v;
}

Ожидаемый вывод - это узел со значением 1, имеющий себя в своем списке смежности, вывод, например, 1 -> 1.

Здесь моя проблема в том, что у меня два разных узла.Когда я внес изменение в один из них, другой не изменился, действуя как другой узел.

Например, после построения списка, если я изменяю значение узла, я должен получить вывод наподобие 3 -> 3. Но я получу 3 -> 1. Изменение на узле не влияет на другойодин.Когда я пытаюсь указать adj [0] на t-> next, я получаю бесконечный цикл ...

Ответы [ 5 ]

2 голосов
/ 14 декабря 2011

Мне не совсем понятно, чего вы хотите. Если вы хотите, чтобы Vertex указывал на себя, это просто

void buildList(){
    adj[0] = malloc(1*sizeof(*adj[0])); // allocate memory for one Vertex
    if (adj[0] == NULL){
        perror("Allocation of Vertex failed\n");
        exit(EXIT_FAILURE);
    }
    // adj[0] contains the adress of a Vertex
    // set the num of the Vertex
    adj[0]->num = 1;
    // set the next pointer of the Vertex to its address
    adj[0]->next = adj[0];
}

Можете ли вы уточнить, каким образом это не то, что вы хотите?

1 голос
/ 14 декабря 2011

Вы можете проанализировать фрагмент кода следующим образом:

1 голос
/ 14 декабря 2011

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

Обычно указатель next последнего узла связанного списка назначается NULL.Это будет с меньшей вероятностью вызывать бесконечные циклы.


обычно вы делаете что-то вроде этого:

void buildList(){
  // the list base
  adj[0] = malloc(1*sizeof(*v));
  adj[0]->num = 1;
  adj[0]->next = adj[0]; // <-- make the last node point to itself

  // append more items to the end of the list
  Vertex *v=adj[0];
  while (v != v->next) v = v->next; // <-- find the end of the list
  int i;
  int num_nodes = 1; // <-- specify the number of nodes you want in total
  for (i = 1; i < num_nodes; i++) {
    // append another item
    v->next = malloc(1*sizeof(*v)); 
    // initialize it
    v = v->next;
    v->num = i; 
    v->next = v; // <-- make the last node point to itself
  }
}

, тогда как описанный вами бесконечный цикл, вероятно, исходит из того факта, что вы назначилисписок базы до конца списка.Таким образом, эффективно составляя список цикла.

1 голос
/ 14 декабря 2011

Вы действительно можете ожидать, что выведите все, что хотите, но этого не произойдет.

Вы совершенно ясно создаете два узла, вводя в заблуждение повторное использование v для этого.* Я не совсем уверен в том, что вы пытаетесь сделать;но очистка кода для удаления двух строк, читающих t = v;, вероятно, прояснит, что происходит для вас.

Если вы хотите, чтобы v->next указывал на себя, вам нужно заставить его это сделать.Если вам нужен один узел, вы должны структурировать свой код так, чтобы malloc() вызывался ровно один раз.

Имейте в виду, что Vertex *v; не объявляет вершину;он объявляет указатель на вершину.

0 голосов
/ 14 декабря 2011

Код, который был установлен, выглядит так, как будто он просто создает 2 отдельных узла, а затем вы просто переназначаете узел t = v, что заставляет указатель указывать только на один узел.

резервное копированиеузла 1, в массиве не так ясно, и причины этого.

было бы хорошо, если бы вы могли объяснить логику, которую вы пытаетесь достичь.

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