Я создал программу, которая вставляет узел в связанный список в алфавитном порядке (A-Z). Я могу это сделать, но не могу вставить в начало связанного списка. Можно предположить, что изначально список никогда не бывает пустым. Любая помощь? Вот мой код с соответствующими структурами. Проблема в том, где // Вставка в начало списка

typedef struct fileNode {
    char *tokenName; // hi 
    double token; // 0.5 
    struct fileNode *next; 
} fileNode; 

typedef struct fileStruct {
    char *name; // a.txt 
    int numberOfTokens; // 4 
    fileNode *tokenLL;
    struct fileStruct *next; 
} fileStruct;

void insertLL(struct fileNode *list, char *token){

    struct fileNode *ptr = list;
    struct fileNode *prev = NULL;

    struct fileNode *newNode = malloc(sizeof(struct fileNode));
    newNode->tokenName = token;
    newNode->token = 1; 
    bool inserted = false;
     
    while (ptr != NULL && inserted == false) {

        if (strcmp(ptr->tokenName, token) > 0){
            count++;

            if (prev == NULL){ // Inserting at the front of the list
                newNode->next = ptr;
                ptr = newNode;
                list = newNode;
                inserted = true;
                return;
            }

            else {
                prev->next = newNode; 
                newNode->next = ptr;
                inserted = true;
            }

        } // end of if

        prev = ptr; 
        ptr = ptr->next;

    } // end of while

    if (!inserted){
        prev->next = newNode;
    } // adding to the end of the list

} 
0
econCodergirl 28 Ноя 2020 в 23:11

1 ответ

Лучший ответ

Чтобы изменить прямой объект, на который указывает * list, вам необходимо объявить его как ** list в аргументах вашей функции.

Если вы объявите его как список *, вы измените список * объектов только внутри функции. Это потому, что когда вы вызываете функцию, аргументы, используемые внутри вызываемой функции, являются копией переменных, используемых для вызова функции в вызывающей функции.

#include <stdio.h>

void add(int x,int y){
x=y;
}

void add_ptr(int *x,int y){
*x=y;
}

int main(int argc, char *argv[]) {
int x=1;
int y=2;
add(x,y);
printf("add\t x:%d\n",x);
add_ptr(&x,y);
printf("add_ptr\tx:%d\n",x);

return 0;
}

Если вы объявляете его как ** список, вы собираетесь изменить объект, указанный в адресе, указанном ** списком, когда вы устанавливаете: * (list) = Newnode; (изменение будет постоянным)

void insertLL(struct fileNode **list, char *token){

struct fileNode *ptr = *list;
struct fileNode *prev = NULL;

struct fileNode *newNode = malloc(sizeof(struct fileNode));
newNode->tokenName = token;
newNode->token = 1; 
bool inserted = false;
 
while (ptr != NULL && inserted == false) {

    if (strcmp(ptr->tokenName, token) > 0){
        count++;

        if (prev == NULL){ // Inserting at the front of the list
            newNode->next = *list; /*it's easier to understand with only *list*/
            *list = newNode;
            inserted = true;
            return;
        }

        else {
            prev->next = newNode; 
            newNode->next = ptr;
            inserted = true;
        }

    } // end of if

    prev = ptr; 
    ptr = ptr->next;

} // end of while

if (!inserted){
    prev->next = newNode;
} // adding to the end of the list

} 
1
Hugo Riffaud de Turckheim 28 Ноя 2020 в 20:51