Использование цикла while для проверки содержимого структуры - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь добавить узел в связанный список, однако, когда я использую цикл while, чтобы проверить, установлено ли для «link» значение NULL, цикл выполняется, когда он не должен.

Это как если бы "cursor-> link" не был установлен в NULL, и код внутри цикла while выполняется, я помещаю туда оператор print только для его проверки, и он выполняется, хотя«курсор-> ссылка» установлен в NULL.Функция создания возвращает "узел *".

РЕДАКТИРОВАТЬ - Я извиняюсь, ребята, я отправил этот вопрос поздно ночью, и я думаю, что я, возможно, был не в лучшей форме, чтобы выразить себя должным образом.Кроме того, я все еще немного озадачен тем, как обрабатывать и работать со связанными списками (как, вероятно, показывает мой код).Мне дали шаблон для работы (так как в функциях append и display были предустановлены, и я должен работать с ними как есть).Компилятор не выдал никаких предупреждений с кодом как есть.Однако программа все еще падает в функции добавления вокруг цикла While.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node {
int data;
struct node * link;
} node;

node* create(int data,node* link) {

    node* newNode = (node*)malloc(sizeof(node));

    newNode->data = data;
    newNode->link = link;

    return newNode;
}

void append ( node **, int ) ;

void display ( node * ) ;

int main() {

   node *p ;
   p=NULL;
   int n;
   char ch[10];

   do {
       printf("Enter the value\n");
       scanf("%d",&n);
       append(&p,n);
       printf("Do you want to add another node? Type Yes/No\n");
       scanf("%s",ch);
   }while(!strcmp(ch,"Yes"));

   printf("The elements in the linked list are");

   display(p);

   printf("\n");
   return 0;
}

/* adds a node at the end of a linked list */
void append ( node **q, int num ){

   node *cursor;

   if (*q == NULL) {

       *q = create(num, NULL);
       node *cursor = *q;
   }

   while(cursor->link != NULL) {

       printf("1\n");
       cursor = cursor->link;
   }

       node* newNode = create(num, NULL);
       cursor->link = newNode;
}

void display ( node *q ){

   node *cursor = q;

   while(cursor->link != NULL) {
           printf(" %d", q->data);
           cursor = cursor->link;
       }
   printf(" %d", cursor->data);
}

1 Ответ

0 голосов
/ 02 мая 2019

Как уже упоминал Рай, проблема в том, что курсор, который вы используете в цикле while, никогда не инициализируется.Вместо этого вы создаете новую переменную с тем же именем, когда * q равно нулю.Я вижу еще одну проблему в вашем коде: когда список пуст, вы добавляете новый узел дважды.Сначала в нулевом условии проверки, а затем после цикла while.

Чтобы исправить, переместите эту строку "node * cursor = * q" за пределы условия if и добавьте возврат вместо этого.Также удалите эту строку "node * cursor"

Примечание :: Я предполагаю, что ваш метод создания не имеет проблем.

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