我正在用C写一个清单。 以下是来源:
#include <stdio.h>
#include <stdlib.h>
struct list {
int value;
struct list *next;
};
typedef struct list ls;
void add (ls **head, ls **tail, int val)
{
ls *new, *tmp1, *tmp2;
if (NULL == *head)
{
new = (ls*)malloc(sizeof(ls));
*head = new;
*tail = new;
new->value = val;
new->next = NULL;
return;
}
else
{
tmp1 = *head;
tmp2 = tmp1->next;
while (tmp2 != NULL)
{
tmp1 = tmp2;
tmp2 = tmp1->next;
}
new = (ls*)malloc(sizeof(ls));
new->value = val;
new->next = NULL;
*tail = new;
return;
}
}
void show (ls **head, ls **tail)
{
int i;
ls *tmp;
while (tmp->next != NULL)
{
printf("%d: %d", i, tmp->value);
i++;
tmp=tmp->next;
}
return;
}
int main (int argc, char *argv[])
{
ls *head;
ls *tail;
int n, x;
head = (ls*)NULL;
tail = (ls*)NULL;
printf("\n1. add\n2. show\n3. exit\n");
scanf("%d", &x);
switch (x)
{
case 1:
scanf("%d", &n);
add(*head, *tail, n);
break;
case 2:
show(*head, *tail);
break;
case 3:
return 0;
default:
break;
}
return 0;
}
当我用gcc编译它时
gcc -o lab5.out -Wall -pedantic lab5.c
我得到了奇怪的错误:
lab5.c: In function ‘main’:
lab5.c:84:3: error: incompatible type for argument 1 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:84:3: error: incompatible type for argument 2 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 1 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 2 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
对我来说一切都还可以......
参数类型为ls**
而不是编译器所说的ls
。
有人看到可能出错的地方?
PS。我知道没有必要将*tail
作为参数而没有使用它,但它会是,因为我想开发这个'程序'......
答案 0 :(得分:4)
正如丹尼尔在评论中所说,并且在他的回答中说,使用&
代替*
会给你你想要的东西。这里有一点解释,帮助你记住。
*
de - 引用它所附加的内容,这意味着它将变量视为指针并在该地址给出值。
&
传递引用,这意味着它提供了存储值的地址,或者更确切地说,将指针传递给变量。
由于您希望将指针传递给变量head和tail,因此您希望将它们作为&head
和&tail
传递,这会为您提供值**head
和{{1}在另一端。在你习惯它之前,这似乎是违反直觉的。
答案 1 :(得分:1)
add(*head, *tail, n);
应该是:
add(&head, &tail, n);
因为你需要将head和tail指针的地址传递给函数。
需要对show
函数的调用进行类似的修复。