0

我有两个文件, list_funcs.c 和 list_mgr.c 。List_funcs.c 具有将节点插入链表的功能:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct data_node {
char name [25];
int data;
struct data_node *next;
};

struct data_node * insert (struct data_node **p_first, int elem) {

struct data_node *new_node, *prev, *current;
current=*p_first;
while (current != NULL && elem > current->data) {
   prev=current;
   current=current->next;
} /* end while */
/* current now points to position *before* which we need to insert */
new_node = (struct data_node *) malloc(sizeof(struct data_node));
new_node->data=elem;

new_node->next=current;
if ( current == *p_first ) /* insert before 1st element */
   *p_first=new_node; 
else                       /* now insert before current */
   prev->next=new_node;
/* end if current == *p_first */
return new_node;
};

现在我试图像这样从 list_mgr.c 调用这个函数,但是得到错误“函数'insert'的参数太少”:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list_funcs.h"
int main (void) {
struct data_node *first, *new_node, *ptr;
printf("Insert first node into list\n");
first=ptr=insert(&first, 5);
strcpy(ptr->name,"Alexander");
return 0;
}

为什么我会收到“参数太少”错误,我该如何正确调用它?

头文件 list_func.h 包含:

#define STRINGMAX 25
struct data_node {
char name [STRINGMAX];
int data;
struct data_node *next;
};
struct data_node * insert (struct data_node **, int, char *);
4

3 回答 3

4

该函数有三个参数,而您只传递了前两个。

struct data_node * insert (struct data_node **, int, char *);

要求您传递一个指向 a 的指针data_node*,然后是a int,最后是一个char*类型。

令人困惑的是,您对函数的定义也与声明不匹配,char*定义中省略了最后一个。

于 2013-06-10T16:52:22.703 回答
4

您的定义insert如下所示:

struct data_node * insert (struct data_node **p_first, int elem)

但标题中的声明如下所示:

struct data_node * insert (struct data_node **, int, char *);

注意最后的char *那里。您可能想删除它以使其匹配。

于 2013-06-10T16:53:32.257 回答
1

你的函数原型list_func.h有一个额外的参数:

struct data_node * insert (struct data_node **, int, char *);
/*                one of these doesn't belong:  ^    ^ */

所以函数定义list_mgr.c和调用list_funcs.c匹配,原型list_func.h不匹配。

于 2013-06-10T16:54:28.307 回答