Сортировка вставки программы в связанный список - PullRequest
0 голосов
/ 27 сентября 2019

Я новичок в структурах данных и сейчас изучаю связанный список.Я столкнулся с программой о сортированной вставке, где у меня была функция add () для добавления узлов в отсортированном порядке

         /*Linked List program to add ascending order sorted nodes in     

         the list */
 #include <stdio.h>
  #include <stdlib.h>
enter code here
 struct node {
   int data ;
   struct node link;

 };

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp !=NULL){
         if(temp->data <=num &&(temp->link->data >num                    
                                             ||temp->link==NULL)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
          temp = temp->link;
      }

    }

 }

 void main(){
 struct node *p;
 p = NULL;

 }

Я ожидал добавить узлы в отсортированном порядке по возрастанию, но при вводе данных возникает ошибкаЯ использую кодовые блоки для запуска программы на C

Я думаю, что это должно что-то делать с конечным условием temp-> link == null, но я не могу определить точное условие для этой частикода. Пожалуйста, помогите!

Ответы [ 3 ]

2 голосов
/ 27 сентября 2019
  1. Определение структуры struct node неверно.Я предполагаю, что это опечатка.Это должно быть struct node *link;

  2. Ваши условия для прохождения цикла не верны.Как упоминалось в комментариях, вы получаете доступ к temp->link в случае, если это может быть NULL.

  3. Вы не проверяете условие, что добавляемое число больше всехцифры и должны быть добавлены в конце списка.

Измененная функция ниже.

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;
    r->link = NULL;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp->link !=NULL){
         if(temp->data <=num &&(temp->link->data >num)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
         temp = temp->link;
      }
      temp ->link = r; // add at the end as not added at any other location.
    }
}
1 голос
/ 27 сентября 2019

В дополнение к Rishikesh Raje 's answer (вам нужно использовать указатель внутри struct: struct node* link;; вам нужно проверить first for *Если 1008 * равно нулю, то получить доступ к link->data), цикл можно немного упростить:

// advance only, if we need to insert (at least) after temp->link:
while(temp->link && temp->link->data <= num)
{
    temp = temp->link;
}
// once the loop is done, temp points to the last element smaller than num, so:
r->link = temp->link;
temp->link = r;

В то же время нам не нужно проверять temp->data > num;мы повторно вводим цикл только, если условие цикла было выполнено ранее, которое уже проверило именно это условие;остается самый первый цикл цикла;однако в этом случае ваш if до того, как цикл уже охватил условие.

Примечание: требуется ли вставлять новые элементы после существующих?Если нет, вставка перед выполняется немного быстрее, все, что вам нужно сделать, это заменить <= на < и > на >= ...

0 голосов
/ 27 сентября 2019

Вы должны использовать

( temp->link == NULL || temp->link->data > num )

вместо

( temp->link->data > num || temp->link == NULL )

, потому что если temp-> link имеет значение NULL, первый код вернет true сразу после проверки первого условия и не будетпроверьте второе условие, поэтому вы не получите ошибку.Но когда вы используете его, как во втором выражении, если temp-> link равно NULL, вы получите ошибку, потому что вы пытаетесь достичь поля с именем «data» объекта NULL с кодом

temp->link->data
...