Вставка в связанный список - PullRequest
0 голосов
/ 26 марта 2011

Я написал программу, которая вставляет узлы в связанный список в порядке убывания. Но всякий раз, когда я проверяю свой код с номерами 12,14,13,19,7 в этом порядке. Всякий раз, когда я вводил 7, я брал 7, уже в списке.7 нет в списке до того, как я его вставил. После этого выдайте эту ошибку, если я выберу опцию печати, набрав 2, моя программа вошла в бесконечный цикл. Я не вижу свою ошибку, и я очень запутался.

Ответы [ 3 ]

0 голосов
/ 24 марта 2012

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

Для вставки 2-го элемента нужно быть осторожным

Так что после если условие

else if (temporary->content > i && temporary->nextLink==NULL)
      (*head)->nextLink = newNode;
0 голосов
/ 24 марта 2012

Ваш код делает слишком много.Если вы кодируете его по-другому, особых случаев нет (например, вставка сверху, вставка в конце списка).

int insertNode (NODE **head, int val)
{
   NODE *newnode;

   for ( ; *head; head = &(*head)->nextLink) {
        if ( (*head)->content == val) {
            printf("To be inserted value (%d)is already in the list\n", val);
            return 0;
            }
        if ( (*head)->content > val) break;
        }
   newnode = malloc(sizeof *newnode); // Maybe check return here ;-)
   newnode->content = val;
   newnode->nextLink = *head;
   *head = newnode;
   return 1;
}
0 голосов
/ 26 марта 2011

Я скомпилировал и запустил его, и он, казалось, работал нормально, за исключением одной вещи. insertNode определено для возврата типа int, но 3 из операторов return являются пустыми. Чтобы получить его для компиляции, я изменил их на return 0;. Если бы вы смогли скомпилировать и запустить его как есть, то это могло бы привести к разрушению стека из-за непоследовательных возвращений.

...