#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 и я описали.