我目前正在尝试实现基数排序算法。为了实现,我必须创建一个链表数组。我在以下几行中执行此操作:
typedef struct _nod {
struct _nod *next;
int val;
} nod;
v=(nod*)malloc(10*sizeof(nod));
我为以下函数提供一个未排序的链表 (v),一个代表我想要返回的数字的“n”(1 意味着我想要单位编号,10 意味着我想要十位数等on) 和一个必须排序的未排序链表 (cap)。
nod *sorteaza(nod *v,nod *cap,int n) {
nod *sort,*aux;
int cat,r,i;
sort=(nod*)malloc(sizeof(nod));
while(cap->next!=NULL) {
cat=cap->val/n;
r=cat%10;
adaugaSfarsit(&v[r],cap->val);
cap=cap->next;
}
cat=cap->val/n;
r=cat%10;
adaugaSfarsit((nod)v[r],cap->val);
for(i=0;i<10;i++) {
aux=&v[i];
while(aux->next!=NULL) {
adaugaSfarsitNod(sort,v[i].next);
aux=aux->next;
}
adaugaSfarsitNod(sort,v[i].next);
}
}
我在运行这个程序时遇到的问题是由 v[i] 生成的,它给我以下错误:
1.c: In function ‘sorteaza’:
1.c:73:2: error: incompatible type for argument 1 of ‘adaugaSfarsit’
adaugaSfarsit((nod)v[r],cap->val);
^
1.c:29:6: note: expected ‘struct nod *’ but argument is of type ‘nod’
nod* adaugaSfarsit (nod *cap,int inf)
任何人都可以向我解释为什么它会给我这个错误吗?据我所知 v[i] 是一个点头,这就是我在 adaugaSfarsit 的参数中请求的,它声明如下:
nod* adaugaSfarsit (nod *cap,int inf)
{
nod *nou, *p;
p = cap;
nou = (nod*) malloc( sizeof(nod));
nou->val=inf;
nou->next = NULL;
if(cap == NULL)
cap=nou;
while (cap->next != NULL)
cap = cap->next; //parcurg lista pana ajung la ultimul nod
cap->next = nou; //adaug elementul
return p;
}
nod* adaugaSfarsitNod (nod *cap,nod *nou)
{
nod *p;
p = cap;
if(cap == NULL)
cap=nou;
while (cap->next != NULL)
cap = cap->next; //parcurg lista pana ajung la ultimul nod
cap->next = nou; //adaug elementul
return p;
}
最佳答案
你有太多的转换,这可能表明你在与编译器作斗争并强制它接受你的代码,这是非常糟糕的。
问题是
adaugaSfarsit((nod)v[r],cap->val);
/* ^ here it's very wrong */
不仅 v[r]
已经是 nod
类型,而且您要将其转换为 nod
?
所以解决办法就是改成这个
adaugaSfarsit(&v[r], cap->val);
关于c - 为什么数组中的点头被认为是 'nod' 而不是 'struct nod' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399709/