C中字符的链接列表

时间:2018-12-11 15:26:08

标签: c list pointers linked-list char

我正在尝试创建一个包含字符类型数据的链接列表。

由于某些原因,该代码无法正常工作。 GCC编译器对函数“ add_bottom_ListEl”的警告为

“警告:传递'add_bottom_listEl'的参数2会使指针不经过强制转换而变成整数”

“注意:预期为'char',但参数的类型为'char *”

我怀疑我使用指针的方式出了问题,但是我尝试了很多很多组合,将指针传递给函数等等……但是似乎没有任何效果。

这里的主要功能以及所有其他使用的功能。在所有文件中定义了MAX_CHAR(#define MAX_CHAR 30)

int main()
{
    char name[MAX_CHAR];
    scanf("%s", name);
    ListEl *head = malloc(sizeof(ListEl));
    strcpy(head->name, name);
    head->next = NULL;
    printf("%s", head->name);
    add_bottom_listEl(head, name);
    print_listEl(head);
    return 0;
}
void add_bottom_listEl (ListEl *head, char name)
{
    ListEl *newEl;
    while(head->next!=NULL)
    {
        head=head->next;
    }
    newEl = (ListEl*) malloc(sizeof(ListEl));
    strcpy(newEl->name, name);
    newEl->next = NULL;
}
void print_listEl(ListEl* head)
{
    puts("print");
    ListEl* current = head;
    while (current!=NULL)
    {
        int i=1;
        printf("%d.%s\n", i, current->name);
        ++i;
        current = current -> next;
    }
}

ListEl结构只是链表的常规元素

struct ListEl
{
    char name[MAX_CHAR];
    struct ListEl* next;
};

很明显,我用过

typedef struct ListEl ListEl;

Internet或此站点上的每个链接列表教程仅显示一般如何使用整数或数字而不是数组(字符)处理列表。有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

您的函数“ add_bottom_listEl”使用一个称为“名称”的字符,而不是字符数组(或指向字符的指针)。我的猜测是您希望它成为

add_bottom_listEl(ListEl *head, char *name)

答案 1 :(得分:1)

void add_bottom_listEl (ListEl *head, char name)

应该是

void add_bottom_listEl (ListEl *head, char* name)

答案 2 :(得分:1)

如果您要在add_bottom_listEl中进行修改并返回head,则必须将head作为指针传递给指针:

    void add_bottom_listEl(ListEl** head, char* name) {
        if ( head == NULL ) {         
    //head is invalid, do nothing
            return;
        }
    //Use calloc instead of malloc to initialise the memory area
        ListEl* newEl = (ListEl*)calloc(1, sizeof(ListEl));
    //Ensure only name of the permissible length is copied
        strncpy(newEl->name, name, MAX_CHAR-1);
    //No need to do this now...calloc will initialise it to NULL
        //newEl->next = NULL;

        if ( *head == NULL ) {
    //No nodes in list yet, this is the first
            *head = newEl;
        } else if ( *head != NULL ) {         
    //Find the end of the list
            while((*head)->next!=NULL) {
                *head = (*head)->next;
            }
        }
    //Add the new node to the list
        *head = newel;
   }

调用此函数的修改版本时,请传递指针的地址:

    add_bottom_listEl(&head, name);

您可以通过以下操作使typedef更具可读性:

    typedef struct _listEl {
        char name[MAX_CHAR];
        struct _listEl* next;
    } ListEl;