упорядоченный список в C, возвращающий только один узел (голова перезаписана) - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать упорядоченный список в C, учитывая конкретный прототип:

int insertInOrder (list_t list, char *surname, char *name);

Функция должна вставить все узлы в правильном положении (в алфавитном порядке сначала по фамилии, затем по имени, по сравнениюв функции сравнение ) и возвращает 1, если вставка прошла, 0, если узел является дубликатом.

сравнение возвращает 1, если первый параметр больше, чемвторое, -1, если оно меньше, и 0, если два параметра равны.Я определил:

typedef struct list *list_t;

typedef struct node *link;

struct node{
    char *name;
    char *surname;
    link next;
};

struct list{
    link head;
};

Это моя функция:

int insertInOrder (list_t list, char *cognome, char *nome){
    link t = list->head;
    link p;

    link x = malloc(sizeof(*x));
    x->name = malloc(strlen(name)*sizeof(char));
    x->name = name;
    x->surname = malloc(strlen(surname)*sizeof(char));
    x->surname = surname;
    x->next = NULL;


    if(list->head == NULL){
        list->head = x;
        return 1;
    }
    else{
        while(t!=NULL){
            if(comparison(t,x)<0){
                p = t;
                t = t->next;
            }
            else if(comparison(t,x)>0){
                if(t == list->head){
                    x->next = list->head;
                    list->head = x;
                    return 1;
                }
                else{
                    p->next = x;
                    x->next = t;
                    return 1;
               }
            }
            else if(comparison(t,x)==0)
                return 0;
        }
        p->next = x;
        return 1;
    }
}

t - указатель на текущий узел, p - этоуказатель на предыдущий.

Когда я печатаю список, голова перезаписывается (новый узел заменяет старый, и список появляется, как будто у него только один узел), и я не могу понять, почему.

консольный результат

Есть предложения?

...