所以我正在创建一个有趣的链表计数器,这是我的程序。
我想要什么: 我希望它给我正确的计数
我得到的是什么: 以下错误:
linkedlist.c:12: warning: assignment from incompatible pointer type
linkedlist.c:14: warning: assignment from incompatible pointer type
linkedlist.c: In function ‘main’:
linkedlist.c:22: warning: assignment from incompatible pointer type
linkedlist.c:23: warning: assignment from incompatible pointer type
linkedlist.c:24: warning: assignment from incompatible pointer type
linkedlist.c:25: warning: assignment from incompatible pointer type
我的代码 我意识到这不是实例化链表的好方法。然而,这并不重要,我强调的是我的反击是有效的。
我对我的代码做了一些修改。不,这不是一个c ++程序,它实际上是一个c程序。
我的程序现在有效,但我想知道为什么我会收到很多关于不兼容指针类型的警告。有任何想法吗?我确定这是一个简单的问题。
#include <stdio.h>
typedef struct {
int x;
char *y;
struct CELL *next;
} CELL;
int list_length(CELL *head){
int counter;
CELL *current;
if(head->next!=NULL){
current=head->next;
for(counter=1;current!=NULL;++counter){
current=current->next;}}
else
return 0;
return counter;}
main(){
CELL a,b,c,d,e;
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=NULL;
int l=list_length(&a);
printf("The list length is %d \n",l);
}
答案 0 :(得分:3)
首先,让这个程序编译......
struct CELL
char *
代替string
(字符串不是C数据类型)对于list_length()
中的算法,你想要更像这样的东西:
int list_length(struct CELL *head)
{
int counter = 0;
while (head) {
head = head->next;
++counter;
}
return counter;
}
您还应注意,您的instantiate()
函数返回指向堆栈分配内存的指针,从而导致未定义的行为。将代码从instantiate()
移动到主函数中。
这是一个完整的工作计划:
#include <stdio.h>
struct CELL {
struct CELL *next;
};
int list_length(struct CELL *head)
{
int counter = 0;
while (head) {
head = head->next;
++counter;
}
return counter;
}
int main(void)
{
struct CELL a, b, c, d, e;
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
e.next = NULL;
printf("The list length is %d \n", list_length(&a));
return 0;
}
要修复最近一次迭代中的警告,您需要声明CELL
这样的内容:
typedef struct CELL_ {
int x;
char *y;
struct CELL_ *next;
} CELL;
答案 1 :(得分:1)
您尚未包含<string>
,并且您在结构定义的末尾缺少分号。您的代码也有其他错误,例如返回指向局部变量的指针。在我看来,这是一个C ++程序,但你已经将它标记为C。
答案 2 :(得分:0)
C没有string
数据类型...请改用char *
。