Как исправить эти недопустимые типы аргументов (связанные списки / структуры) и сделать так, чтобы они больше не повторялись? - PullRequest
0 голосов
/ 28 апреля 2019

Итак, в этом семестре в колледже мы начали изучать C. Я думал, что понял концепцию указателей, но теперь я понимаю, что мне действительно нужна ваша помощь. В качестве последнего задания нам нужно написать программу, которая, помимо прочего, способна читать набор слов из файла, помещать их все в связанный список и сортировать его (в алфавитном порядке и по другим критериям). В настоящее время я пытаюсь кодировать эту часть, но сталкиваюсь с множеством «неверных аргументов типа ->» и тому подобным, поэтому мне действительно нужна помощь, чтобы понять, что я делаю неправильно, как это исправить и как убедиться в этом больше не повторяется из-за моего невежества.


typedef struct local{
    char *name;
    struct local *next;

}t_local;

void printlocalsalphabetical(t_local *header_l){
    createlistlocals(*header_l);
    sort_alphabetical(*header_l);

    t_local l   = header_l->next;
    while (l){
        puts(l->name);
        l=l->next;
    }

}

void crialistlocals(t_local *header_l){
    FILE *fp;
    t_local *aux = header_l->next;
    char line[150];
    char *namel;
    fp = fopen("locais.txt","r");

    while (!feof(fp)){
        fgets(line, 100, fp);
        namel = strtok(line, '/');
        aux->name = namel;
        aux->next = header_l;
        header_l= aux;
    }

}

void sort_alphabetical(t_local *header_l){
    int swapped;
    t_local *ptr1;
    t_local *lptr = NULL;


    if (header_l == NULL)
        return;

    do
    {
        swapped = 0;
        ptr1 = header_l;

        while (ptr1->next != lptr)
        {
            if (ptr1->name > ptr1->prox->name)
            {
                swap(ptr1, ptr1->next);
                swapped = 1;
            }
            ptr1 = ptr1->next;
        }
        lptr = ptr1;
    }
    while (swapped);
}

void swap(t_local *a, t_local *b)
{
    char *temp = a->name;
    a->name = b->name;
    b->name = strdup(temp);
}


t_local *create_headerL(void){
    t_local *list = (t_local*)malloc(sizeof(t_local));
    if (list != NULL)
        list->next = NULL;

    return lista;

}

int main()
{
    t_local *header_l = create_headerL();
    printlocalsalphabetical(*header_l);
    return 0;

}

Я действительно борюсь с этим, и я начинаю очень волноваться из-за своей неспособности понять это, поэтому вся помощь и любая помощь очень приветствуются

1 Ответ

1 голос
/ 28 апреля 2019

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

void printlocalsalphabetical(t_local *header_l)

Это определение.header_l является указателем на t_local.

    createlistlocals(*header_l);
    sort_alphabetical(*header_l);

Это вызовы функций, где *header_l являются выражениями, которые разыменовывают указатель, давая t_local.Обе функции хотят указатель на t_local, поэтому удалите звездочку.

    t_local l = header_l->next;

Здесь вы определяете t_local, но header_l->next - указатель на t_local, и l должентакже указатель: Измените на t_local *l.

        puts(l->name);
        l=l->next;

Оператор -> работает только в том случае, если левая часть является указателем на структуру или суньон.Использование . исправит синтаксическую ошибку, но не исправит код.На самом деле код уже был исправлен путем изменения типа l на t_local *.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...