Создайте функцию для вставки нового узла в его правильное положение в отсортированном односвязном списке дат

#c #linked-list #singly-linked-list

#c #связанный список #односвязный список

Вопрос:

Итак, у меня есть отсортированный односвязный список, и я должен добавить новый узел в правильном положении.

Вот мои структуры:

 typedef struct date {  int dd;  int mm;  int yy; } date;  typedef struct node {  date d;  node* next; } node;  

И вот функция, которую я сделал:

 node* addNode(date pn, node* head) {  node* pnew = (node*)malloc(sizeof(node));  pnew-gt;p = pn;  pnew-gt;next = NULL;    for (node* i = head; i != NULL; i = i-gt;next)  {  if (i-gt;d.yy gt; pnew-gt;d.yy)  {  if (i-gt;d.mm != pnew-gt;d.mm || i-gt;d.dd != pnew-gt;d.dd)  continue;  else  {  pnew-gt;next = i-gt;next;  i-gt;next = pnew;  break;  }  }  else if (i-gt;d.yy == pnew-gt;d.yy amp;amp; i-gt;d.mm gt; pnew-gt;d.mm)  {  if (i-gt;d.dd != pnew-gt;d.dd)  continue;  else  {  pnew-gt;next = i-gt;next;  i-gt;next = pnew;  break;  }  }  else if (i-gt;d.yy == pnew-gt;d.yy amp;amp; i-gt;d.mm == pnew-gt;d.mm amp;amp; i-gt;d.dd gt; pnew-gt;d.dd)  {  pnew-gt;next = i-gt;next;  i-gt;next = pnew;  break;  }  else if (i-gt;d.yy == pnew-gt;d.yy amp;amp; i-gt;d.mm == pnew-gt;d.mm amp;amp; i-gt;d.dd == pnew-gt;d.dd)  {  pnew-gt;next = i-gt;next;  i-gt;next = pnew;  break;  }  }    return head; }  

На самом деле я проверил, работает ли этот фрагмент кода pnew-gt;next = i-gt;next; i-gt;next = pnew; И это хорошо работает, поэтому проблема связана с if утверждениями. Но я не могу найти ошибки.

Комментарии:

1. for (i = head; i != NULL; i = i-gt;next) lt;lt;— i не определено.

2. После вставки нового узла вы все равно продолжаете цикл. Тебе следует перестать зацикливаться.

3. Создайте функцию для сравнения двух узлов. На основе возвращаемого значения цикл может либо продвигаться в связанном списке, либо вставлять новый узел и завершаться.

4. Создайте функцию сравнения, которая принимает два date * и возвращает 0 , если даты равны, и -1 или 1 в зависимости от того, какая из них позже другой. Другими словами, разделите логику сравнения и логику вставки.

5. Также рассмотрите возможность использования a time_t для даты. Вы можете struct tm легко ввести год, месяц и день. Затем используйте mtkime , чтобы преобразовать это в time_t . Это облегчает сравнение. Вы также можете сделать это в функции сравнения, такой как @wildplasser и я описали.