插入有序的双向链表

时间:2015-04-07 19:15:54

标签: c list

我编写了一个函数,将一个元素插入一个双向链表中,按顺序维护列表(按元素struct的字段nr_indeksu)。它在某些输入上正确运行,但是给出了这些数据......

11111 Aleks 3
22222 Kuba 5
33333 Filip 84
44444 Szymon 2
55555 asdasd 5
66666 qweqwe 2

...它将第一个记录(11111 Aleks 3)放在最后一个位置,而不是第一个位置。这是功能:

void Insert(para **head, para **tail, para wczytywanie) // przerabianie     funkcji insert
{
    para *temp = (struct para*)malloc(sizeof(struct para));
    temp->nr_indeksu = wczytywanie.nr_indeksu;
    strcpy(temp->nazwisko, wczytywanie.nazwisko);
    temp->ocena = wczytywanie.ocena;

    if (isEmpty(*head))
        InsertAsFirstElement(head, tail, wczytywanie);
    else if (head == tail) // jezeli jest dopiero jeden element w liscie
    {
        if ((*head)->nr_indeksu < temp->nr_indeksu)
        {
            InsertAsLastElement(head, tail, wczytywanie);
        }
        else
        {
            // dodanie przed headem
            (*head)->prev = temp;
            temp->next = *head;
            temp->prev = NULL;
            *head = temp;
        }
    }
    else // jak znajdziemy odpowiedni element wstawiamy za nim
    { 
        struct para *search = *head;
        while (search->next != NULL && search->nr_indeksu < temp->nr_indeksu)
            search = search->next;
        if (search->prev == NULL)
        {
            (*head)->prev = temp;
            temp->next = *head;
            temp->prev = NULL;
            *head = temp;
        }
        else if (search->next == NULL)
        {
            if (search->nr_indeksu < temp->nr_indeksu)
            {
                temp->next = *tail;
                temp->prev = (*tail)->prev;
                (*tail)->prev->next = temp;
                (*tail)->prev = temp;

            }   //przed tailem
            else
            {
                temp->prev = *tail;
                (*tail)->next = temp;
                temp->next = NULL;
                (*tail) = temp;
            }
                //za tailem
        }
        else
        {
            temp->next = search;
            temp->prev = search->prev;
            search->prev->next = temp;
            search->prev = temp;
            //przed searchem
        }
    }
}

我的错误是什么?

0 个答案:

没有答案