Добавление узла в связанный список в определенной позиции в C

Я пытаюсь добавить узел в связанный список. Идея состоит в том, чтобы передать указатель, посмотреть, куда новый узел пойдет через ранжированный порядок, в данном случае G, затем D, затем M, затем S.

Тем не менее, когда я компилирую и запускаю, я на самом деле не генерирую связанный список (это уже было сделано в основном). Я более чем уверен, что с моей функцией addp() что-то не так. Должен ли я вместо этого указывать в двойных указателях? Извините за то, что довольно непрофессионально и невежественно. Я не самый сильный из кодеров.

Любая помощь будет полезна.

Я приложил свой метод, который я проходил так много раз.

typedef struct node {
char fname[1024];
char lname[1024];
char pos;
int val;
int rank;
struct node * next;
} player;


    struct node* addp (player* newnode, struct node* list){
    player* templist = list;
        player* templist1;
    // if the list is non empty.
    if (list!=NULL){
        if(newnode->pos == GOALKEEPER){  //insert if G.
            newnode->next = list;
        }
        if(newnode->pos == DEFENDER){// after G bef M.
            // iterate through templist.
            while (templist->next != NULL && (templist->next)->rank < 1) {  // go to end of G.
                // when the list isn't empty next node rank is less than one, keep going
                templist = templist -> next;
            }
            // when finally rank == or > 1, then add newnode.
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        if(newnode->pos == MIDFIELDER){ //after G and M but before S
            while (templist->next != NULL && (templist->next)->rank <2 && (templist->next)->rank> 2){
                templist = templist -> next;
            }
            // when stopped, then add newnode.
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        if(newnode->pos == STRIKER){ // at the end.
            while (templist->next != NULL && (templist->next)->rank <3){
                templist = templist -> next;
            }
            templist1 = templist->next;
            templist->next = newnode;
            newnode->next = templist1;
        }
        return list;
        printf("player added");
    }
    // if list is empty
    else{
        newnode->next = list;
        return 0;
    }
}

Ниже приводится список функций, которые я придумал. Он продолжает говорить, что мой связанный список пуст. Может быть, что-то не так с этой функцией.

int print(struct player* list){
    // create temp list so non modify origin.
    struct player* temp = list;
    if (list == NULL && temp == NULL)
        printf("linked list is empty");
    while (temp != NULL){
        printf("%s \n", temp->lname);
        printf("%s \n", temp->fname);
        printf("%c \n", temp->pos);
        printf("d \n", temp->val);
        temp = temp->next;
    }
return 0;
}

2 ответа

Решение

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

void addp(player* newnode, player* firstnode)

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

Итак, я понял, что ваша структура игрока содержит переменную pos, которая будет указывать, в каком месте вставить игрока в список. Я прав?

В этом случае лучшее, что вы можете сделать, это отсортировать список по переменной ранга. Затем измените вашу переменную pos (в структуре игрока), чтобы она соответствовала переменной ранга вашего списка.

Тогда вам просто нужно добавить его с помощью классической функции "добавить в отсортированный список": C++ Добавить в связанный список в отсортированном порядке, введите описание ссылки здесь

Другие вопросы по тегам