从链表中的不兼容指针类型分配?

时间:2013-09-01 20:49:36

标签: c pointers

我是C的新蜜蜂。我目前在C中编写链表。在编译时,它一直在抱怨“从不兼容的指针类型中分配”。我的代码是这样的:

# include <stdio.h>
#include <stdlib.h>

struct snode{
  struct snode *next;
  int val;
};

struct slist{
  struct snode *head;
  struct snode *tail;
  int len;
};

struct slist *mylist;

void slist_insert(int v){
  struct snode *newnode;
  newnode = (struct snode*)malloc(sizeof(struct snode));
  newnode -> val = v;
  newnode -> next = NULL;


  if(mylist->head  = NULL){
    mylist->head  = malloc (sizeof(struct snode));
    mylist->tail = (struct snode*)malloc (sizeof(struct snode));
    mylist->head = newnode;
    mylist->tail = newnode;

  };

  else{
    mylist -> tail -> next = (struct snode*)malloc (sizeof(struct snode));
    mylist -> tail -> next = newnode;
  };
   mylist -> len +=1;  
};


main(){
    slist_insert(1);
    slist_insert(2);
    slist_insert(3);
    slist_insert(4);
    slist_insert(5);

    struct snode *temp;
    temp = (struct snode*)malloc(sizeof(struct snode));
    temp = mylist-> head;
    while(temp -> next != NULL){
      printf("%d\n", temp -> val);
      temp  = temp -> next;
    };
  };

这是修改过的。我正在使用linux终端来运行这个程序。我使用的编译器是gcc -std = gnu99

更新

slist.c: In function â:
slist.c:32: error: â without a previous â
slist.c: At top level:
slist.c:40: warning: return type defaults to â

2 个答案:

答案 0 :(得分:4)

此代码存在许多问题。我列出导致“从不兼容指针分配”警告的问题。使用gcc -W -Wall进行编译并修复所有警告。在你完成之后,仍然会有错误。

  1. 您需要#include <stdlib.h>,在现有#include <stdio.h>之后,才能使malloc的声明可见。 (如果不这样做,编译器必须假设malloc返回int,即使它完全清楚这是错误的。这就是“incompatible implicit declaration of built-in function ‘malloc’”警告试图告诉你。)

  2. 您错误地将struct snode分配投放到struct slist *,然后在几个地方将它们分配到struct snode *字段。不要将malloc的返回值强加给任何东西;只是分配它。 (请注意,您可能会看到有人在代码中故意将malloc的返回值转换为需要编译为C ++和C的代码。不要这样做,直到您有足够的经验来理解如果有必要的话。如果编译器坚持将所有内容都视为C ++,即使它是C语言,也可以使用更好的编译器。)

  3. struct snode的{​​{1}}字段应声明为next,而不是struct snode *

答案 1 :(得分:2)

你的next是指向int的指针,而你希望它是指向struct snode的指针。 此外,我假设你的mylist是一个slist而不是指向slist的指针。正如在评论中已经指出的那样,那个mylist的元素不一定是初始化的(实现依赖。使用指针用于mylist的模式,你需要malloc(和init)那个人首先...