работа с массивом связанного списка - PullRequest
7 голосов
/ 09 февраля 2011

Мой подход:

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

Это структура:

struct node{
       char data[16];
       struct node *next;
};

Мое объявление для этого массива

struct node *nodesArr[20];

теперь, чтобы добавить новый узел в одиниз связанного списка, я делаю это:

struct node *temp;

temp = nodesArr[i]; // i is declared and its less than 20
addNode(temp,word); // word is declared (char *word) and has a value ("hello")

Функция addNode:

void addNode(struct node *q, char *d){
    if(q == NULL)
        q = malloc(sizeof(struct node));
    else{
        while(q->next != NULL)
            q = q->next;

        q->next = malloc(sizeof(struct node));
        q = q->next;
    }

    q->data = d; // this must done using strncpy
    q->next = NULL; 
}

и для печати данных из массива связанного списка, я делаю это:

void print(){
    int i;
    struct node *temp;

    for(i=0 ; i < 20; i++){
        temp = nodesArr[i];
        while(temp != NULL){
            printf("%s\n",temp->data);
            temp = temp->next;
        }
    }
}

теперь компилятор не выдает ошибку, программа запускается и я передаю ей данные, а когда я вызываю print, она ничего не печатает, ??

UPDATE ::

после того, как я отредактировал код (спасибо за вас), я думаю, что проблема в функции печати, есть идеи?

Ответы [ 4 ]

5 голосов
/ 09 февраля 2011

Проблема заключается в addNode().Когда список пуст, вы делаете:

q = malloc(sizeof(struct node));

, но область действия q ограничена addNode().Вы должны были объявить addNode() как

void addNode(struct node **q, char *d)

и соответственно изменить свой код:

*q = malloc(sizeof(struct node));

и так далее ...

3 голосов
/ 09 февраля 2011

Когда вы передаете struct node *q в addNode, вы даете ему адрес для элемента в вашем массиве.Если вы используете malloc внутри, то вы перезаписываете эту переменную q, которая является локальной для функции и теперь указывает на что-то другое, но вы не изменили свой исходный массив.Попробуйте использовать указатель на указатель на узел (struct node **q).

2 голосов
/ 09 февраля 2011
void addNode(struct node *q, char *d){
    if(q == NULL)
        q = malloc(sizeof(struct node));

Вот проблема.

Новое значение q никогда не выходит из функции, поэтому ваш массив связанных списков никогда не обновляется.

Обычнорешение здесь состоит в том, чтобы использовать двойной указатель:

void addNode(struct node **q, char *d){
    if(*q == NULL)
        *q = malloc(sizeof(struct node));

и назвать его так:

addNode(&nodesArr[i],word);

Тогда, если вы malloc новый узел, значение вмассив будет указывать на новый узел.

0 голосов
/ 24 августа 2015
struct node
{

  int actual, estimated;

  char c;

  struct node *next;

} *head[4], *var[4], *trav[4];


void
insert_at_end (char c, int value, int value1)
{

  struct node *temp;

  temp = head[i];

  var[i] = (struct node *) malloc (sizeof (struct node));

  var[i]->actual = value;

  //var1=(struct node *)malloc(sizeof(struct node));

  var[i]->estimated = value1;

  var[i]->c = c;

  //printf("%d",var->estimated);

  if (head[i] == NULL)

    {

      head[i] = var[i];

      head[i]->next = NULL;

    }

  else

    {

      while (temp->next != NULL)

    {

      temp = temp->next;

    }

      var[i]->next = NULL;

      temp->next = var[i];

    }

}
...