链表计数器中的几个错误

时间:2011-10-22 00:26:42

标签: c

所以我正在创建一个有趣的链表计数器,这是我的程序。

我想要什么: 我希望它给我正确的计数

我得到的是什么: 以下错误:

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);
}

3 个答案:

答案 0 :(得分:3)

首先,让这个程序编译......

  1. CELL不是类型,因此您需要在类型声明中使用struct CELL
  2. 结构最后需要分号
  3. 使用char *代替string(字符串不是C数据类型)
  4. 对于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 *