在链表中排序插入

时间:2016-09-15 18:21:15

标签: c linked-list

我尝试创建一个基于两个变量levelname进行排序插入的函数。显然我有一些逻辑和语法错误。

我的链表结构:

struct node {
    struct node *next;
    int level;
    char name;
};

我的字符串比较功能:

int compare(struct node *one, struct node *two)
{
    return strcmp(one->name, two->name);
}

我的插入功能:

void insert(struct node **head, const int level, const char name, int(*cmp)(struct node *l, struct node *r))
{
    struct node *new =NULL;
    /* Find the insertion point */
    for (; *head; head = &(*head)->next)
    {
        if ((*head)->level > level) {     // I think this is what is causing the issue
            if (compare(*head, new) > 0)
            break;
        }
    }

    new = malloc(sizeof *new);
    new->level = level;
    new->name = name;
    new->next = *head;
    *head = new;
}

这是调用堆栈:

insert(node **head, const int level, const char name, int(*)(node *, node *))

3 个答案:

答案 0 :(得分:1)

您正在将 NULL 值传递给 cmp 函数(?!?可能正确的函数是 int compare(...)尝试初始化 new 变量的值,然后再将其传递给函数。

答案 1 :(得分:1)

您的语法错误就在这一行:

return strcmp(one->name, two->name);

函数strcmp期望两个char*(又名char指针),但你给它两个char

问题是......你想要

吗?
char name;

char* name;

为了让compare正确,这很重要。

此外,您需要重新排列insert功能,以便在使用之前创建新节点。类似的东西:

void insert(struct node **head, const int level, const char name, int(*cmp)(struct node *l, struct node *r))
{
    struct node *new =NULL;

    // Create and initialize new....
    new = malloc(sizeof *new);
    new->level = level;
    new->name = name;

    /* Find the insertion point */
    for (; *head; head = &(*head)->next)
    {
        if ((*head)->level > level) {     // I think this is what is causing the issue
            if (cmp(*head, new) > 0)
                        // ^^^ So that you can use it here

            break;
        }
    }

    new->next = *head;
    *head = new;
}

答案 2 :(得分:1)

您将node.name声明为类型char,但您的比较函数被编写为好像是char的以空值终止的数组或指向此类数组的指针(即C字符串) 。你似乎想要这个:

struct node {
    struct node *next;
    int level;
    char *name;
};

或者这个:

struct node {
    struct node *next;
    int level;
    char name[MY_MAXIMUM_NAME_LENGTH_PLUS_ONE];
};

此外,您的insert()函数将NULL指针传递给比较函数作为其第二个参数,因为您从不为指针new分配任何内存,当然,永远不会将值赋给非 - 现有成员。这甚至没有意义。你觉得你在比较什么?你似乎想要这样的东西:

struct node *new = malloc(sizeof *new);

if (!new) {
    // allocation failure -- abort ...
}

new->level = level;
new->name = /* hmmmm ... */;

当然,你的名字类型的问题也会出现在这里。