c 警告 - 从不兼容的指针类型传递“插入”的参数 1

c warning - passing argument 1 of ‘insert’ from incompatible pointer type

我是 C 编程的新手。我要写一些functions/procedures的作业,然后用教授给的make test来测试

我有一个包含两个元素的结构:第一个元素是指向列表的指针,第二个元素是列表排序所依据的顺序类型。这是数据结构:

/* order type
NOTORD = no order
TIME = ordered by increasing time
POSITION = ordered by increasing position */
typedef enum {NOTORD=0, TIME=1, POSITION=2} ord_t;

typedef struct elem {
  double position;
  double time;
  struct elem * next;
} elem_t;

typedef struct {
  elem_t * head;
  ord_t ord; 
} lista_t;

我必须根据订单类型向列表中插入一个元素(由输入给出)。这是我的代码:

void inserisciInTesta(lista_t *l, elem_t *el) {
    el->next=l->head;
    l->head=el;
}

void inserisciTime(lista_t * l, elem_t* pelem) {
   if(l->head->time >= pelem->time)
       inserisciInTesta(l, pelem);
   else
       inserisciTime(l->head->next, pelem);
}

void inserisciPosition(lista_t * l, elem_t* pelem) {
    if((l->head)->position >= pelem->position)
        inserisciInTesta(l, pelem);
    else
        inserisciPosition(l->head->next, pelem);
}

int inserisci(lista_t * l , elem_t* pelem) {  
    if(l->ord==TIME) {
        inserisciTime(l, pelem);
        return 0;
}
    else if(l->ord==POSITION){
        inserisciPosition(l, pelem);
        return 0;
}
    else {
        inserisciInTesta(l, pelem);
        return 0;
    }
}

进行测试时,我收到以下警告:

raggi.c: In function ‘inserisciTime’:

raggi.c:42:27: warning: passing argument 1 of ‘inserisciTime’ from incompatible pointer type [-Wincompatible-pointer-types]

        inserisciTime(l->head->next, pelem);
                      ^

raggi.c:38:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’

void inserisciTime(lista_t * l, elem_t* pelem) { ^

raggi.c: In function ‘inserisciPosition’:

raggi.c:49:31: warning: passing argument 1 of ‘inserisciPosition’ from incompatible pointer type [-Wincompatible-pointer-types]

        inserisciPosition(l->head->next, pelem);
                          ^

raggi.c:45:6: note: expected ‘lista_t * {aka struct *}’ but argument is of type ‘struct elem *’

void inserisciPosition(lista_t * l, elem_t* pelem) { ^

我的代码有什么问题?在此先感谢您的帮助。

编译器警告几乎说明了一切。考虑第一个。 insetisciTime 期望 lista_t * 作为它的第一个参数。坏电话正在通过 l->head->next。那是什么类型的?好吧,l 是一个 lista_t *。所以 l->head 是一个 elem_t *。所以l->head->next是一个struct elem *,相当于elem_t *。这是类型不匹配:该函数需要 lista_t *,而您传递的是 elem_t *.

必须更改两者之一:更改函数以匹配您传递的内容,或者更改您传递的内容以匹配函数的期望。编译器警告将您保存在这里,因为它不可能按原样工作。

另一个警告有完全相同的问题。

错误的原因是汤姆解释的。我建议您更改函数,而不是使用递归调用(即函数调用自身),而是使用 while 循环来查找需要插入元素的位置。

考虑到插入新元素时需要修改两个指针:指向下一个元素的指针和前一个元素的指针。使用递归函数执行此操作可能会更加混乱。

此外,检查在列表开头、列表末尾以及列表是否为空的特殊情况。