Нужна помощь в создании моего списка в алфавитном порядке - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь создать алфавитно упорядоченный связанный список из файла, поместив узел в правильное место после его прочтения. Файл не должен быть в алфавитном порядке. Программа правильно читает файл, и я могу добавить все в конец списка.

Place search_place(Place first, char *new){

    Place aux = first;

    while (aux->abcnext != NULL){
        if ( strcmp(new,aux->place) > 0)
            aux = aux->abcnext;
        else
            break;
    }
    return aux;
}

void insert_place(Place first, char* string){

    Place previous,temp,new;

    previous = search_place(first, string);

    if (previous->abcnext == NULL){
        new = create_place();
        previous->place = string;
        new->abcnext = previous->abcnext;
        previous->abcnext = new;
    }

    else{
        new = (Place)malloc(sizeof(place_node));
        new->place = string;
        new->abcnext = previous;
        previous = new;
    }
}


Place create_place(){
    Place aux;
    aux=(Place)malloc(sizeof(place_node));

    if (aux!=NULL){
        aux->place=malloc(25*sizeof(char));
        aux->abcnext=NULL;
    }
    return aux;
}


typedef struct placenode*Place;

typedef struct placenode{
    char *place;
    Place abcnext;
}place_node;

Учитывая результаты, полученные из этого кода, я полагаю, что проблема связана либо с указателями, либо с заголовком связанного списка, либо с обоими. С 4 местами: P, Z, W, L - я получаю только P -> Z из списка.

1 Ответ

0 голосов
/ 16 мая 2019
if (previous->abcnext == NULL){
    new = create_place();
    previous->place = string;
    new->abcnext = previous->abcnext;
    previous->abcnext = new;
}

Пара очевидных проблем с приведенным выше кодом. Во-первых, вы не устанавливаете new->place - вы заменяете previous->place, что кажется неправильным. Таким образом, ваш новый узел будет иметь значение NULL для своего «места», и вы потеряете значение для предыдущего узла.

Во-вторых, вы присваиваете значение string, а не делаете новую копию. Если вы используете одну и ту же строку каждый раз, когда вызываете функцию, вы получите все узлы, указывающие на одну и ту же строку.

Вы должны сделать что-то вроде

    new->place = malloc(strlen(string)+1);
    strcpy(new->place, string);

или, если она есть в вашей версии C, используйте strdup

    new->place = strdup(string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...