Как правильно добавить узел в связанный список справа - PullRequest
0 голосов
/ 15 января 2019

Я хочу написать функцию, которая, передаваемая двумя параметрами (имя файла и глобальный список), выполняет следующее: если список пуст и файл существует, функция начинает читать содержимое файла,Для каждого символа он генерирует узел в связанном списке, где хранится символ, а затем добавляет узел в список справа.Наконец, функция возвращает в качестве параметров созданный список и значение 1, в противном случае она завершает выполнение функции и возвращает 0 в качестве параметра.

Ниже приводится решение, предоставленное моим учебникомупражнение, но я не могу понять, как он возвращает список «л».В этом случае «l» не должен указывать только на первый узел?

struct el {
struct el *next;
char data;
};
struct el *list=NULL;

int add (char *name, struct el **l) {
   FILE *f; char c;
   struct el *temp, *last = NULL; 
   f= fopen(name, "r");
   if (f==NULL || (*l)!=NULL){
   printf("errf");
   return 0;
   }
   c=fgetc(f);
   while (c!=EOF) {
      temp= (struct el *) malloc(sizeof(struct el));
      if (temp==NULL) return 0;
      temp->data=c;
      temp->next=NULL;
      if (*l==NULL){
        last=temp;
        *l=temp;
      }
      else{
        last->next=temp;
        last=temp;
    }
   c=fgetc(f);
   }
  fclose(f);
  return 1;
}

1 Ответ

0 голосов
/ 15 января 2019

Функция add принимает два параметра: имя файла и указатель на указатель struct el (список списков). Стоит отметить, что функция только работает с первым «списком» или *l или l[0]

if (*l==NULL){     // if no characters in the first list of l then
  last=temp;       //   initialize the list with the first character
  *l=temp;
}
else{              // else the first list of l has been initialized so
  last->next=temp; //   add new reference and data to current end node
  last=temp;
}

Поскольку вы инициализируете первый список *l с тем же указателем, что и last, вы по-прежнему создаете ссылку при назначении текущего указателя struct el на last->next, сохраняя указатель *l на корневой узел.

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