我尝试创建一个基于两个变量level
和name
进行排序插入的函数。显然我有一些逻辑和语法错误。
我的链表结构:
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 *))
答案 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 ... */;
当然,你的名字类型的问题也会出现在这里。