我是C编程的新手。我必须为家庭作业写一些函数/程序,然后用教授给出的make测试来测试它们。
我有一个带有两个元素的结构:第一个元素是指向列表的指针,第二个元素是按顺序排序的顺序类型。以下是数据结构:
/* 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:在函数'inserisciTime'中:
raggi.c:42:27:警告:从不兼容的指针类型传递'inserisciTime'的参数1 [-Wincompatible-pointer-types]
inserisciTime(l->head->next, pelem); ^
raggi.c:38:6:注意:预期'lista_t * {aka struct *}'但参数类型为'struct elem *'
void inserisciTime(lista_t * l,elem_t * pelem){ ^
raggi.c:在函数'inserisciPosition'中:
raggi.c:49:31:警告:从不兼容的指针类型传递'inserisciPosition'的参数1 [-Wincompatible-pointer-types]
inserisciPosition(l->head->next, pelem); ^
raggi.c:45:6:注意:预期'lista_t * {aka struct *}'但参数类型为'struct elem *'
void inserisciPosition(lista_t * l,elem_t * pelem){ ^
我的代码出了什么问题?在此先感谢您的帮助。
答案 0 :(得分:3)
编译器警告几乎说明了一切。考虑第一个。 insetisciTime
期望lista_t *
作为其第一个参数。糟糕的电话是l->head->next
。那是什么类型的?好吧,l
是lista_t *
。因此l->head
是elem_t *
。因此l->head->next
是struct elem *
,相当于elem_t *
。这是一种类型不匹配:该函数需要lista_t *
,并且您正在传递elem_t *
。
其中一个必须改变:更改功能以匹配您传递的内容,或更改您传递的内容以匹配功能所需的内容。编译器警告将您保存在此处,因为它无法按原样运行。
另一个警告有完全相同的问题。
答案 1 :(得分:0)
错误的原因是汤姆解释的。我建议您更改函数而不是使用递归调用(即函数调用自身),使用while循环查找需要插入元素的位置。
考虑到在插入新元素时需要修改两个指针:指向下一个元素的指针和指向前一个元素的指针。使用递归函数执行此操作可能会更加令人困惑。
另外,检查列表开头,列表末尾插入的特殊情况,以及列表是否为空。