c - 如何修复这些无效的参数类型(链接列表/结构)并确保它们不会再次发生?

标签 c pointers struct linked-list

所以,大学这个学期我们开始学习 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;

}

我真的很挣扎,而且由于我无法理解它,我开始真正感到害怕,所以非常欢迎所有和任何帮助

最佳答案

您必须知道何时使用指针,何时不使用。 (如果您使用链接列表,通常需要指针。)您还必须知道星号何时定义指针以及何时取消引用它。

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;

仅当左侧是指向结构体或 sunion 的指针时,-> 运算符才有效。使用 . 将修复语法错误,但不会修复代码。事实上,通过将 l 的类型更改为 t_local *,代码已经得到修复。

(我只查看了这里的第一个函数,但我希望您能明白。)

所以没必要 panic 。保持冷静,阅读错误消息,确定是否需要指针,然后修复代码。错误消息是为了帮助您,而不是为了惹恼您。

关于c - 如何修复这些无效的参数类型(链接列表/结构)并确保它们不会再次发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55892200/

相关文章:

c - 为 x86 ISA 使用 calloc 的正确方法是什么

android - 在 Android 中通过 JNI 使用 libxml2

c - SEH、访问冲突和堆栈保护页面

c++ - 无法从 int[][] 转换为 int*

c++ - 通过删除基类来破坏派生类

c - 在 C 中返回一堆结构体的更好方法是什么?

C语言 bool 表达式返回值

c - 打印带有和不带有换行符的空字符指针时的不同输出

C宏返回一个结构

string - 如何在 Go 中使用反射设置一个指向字符串的结构成员