从列表程序

时间:2017-01-10 07:54:07

标签: c list pointers

我想创建一个可以在C(可变长度数组)中创建列表的程序,但是当我编译我的代码时,我说有一个"来自不兼容指针类型"错误

错误在以下几行:

list_item *last = l->first;
last = last->next;
last->next = item;

代码:

typedef struct{
    struct list_item *next;
    void *data;
} list_item;

typedef struct{
    list_item *first;
    unsigned int len;
} list;

list *new_list(){
    list *l = (list *) malloc(sizeof(list));
    l->first = NULL;
    l->len = 0;
    return l;
}

list_item *new_list_item(){
    list_item *item = (list_item *) malloc(sizeof(list_item));
    item->next = NULL;
    item->data = NULL;
    return item;
}

void add_to_list(list *l, void *data){
    if(l == NULL || data == NULL){
        return;
    }

    list_item *item = new_list_item();
    item->data = data;

    int i;
    list_item *last = l->first;
    for(i = 0; i < l->len; i++){
        last = last->next;
    }   

    last->next = item;
    l->len++;
}

2 个答案:

答案 0 :(得分:0)

首先在add_to_list中,您需要检查l-&gt; first是否为空(列表为空),因为稍后您尝试访问last-&gt; next但在这种情况下last为null。

此外,函数add_to_list仅接受void *作为数据,因此如果您想添加任何其他内容,您应该进行类型转换

例如:

add_to_list(l,(void *)4)如果是数字或

add_to_list(l,(void *)struct something);

答案 1 :(得分:-1)

您引用的错误是由此引起的:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<ul id="mylist" class="text-center">
  <li><a class="btn btn-warning btn-outline btn-lg sharp" href="http://google.com" target="_blank"> <i class="fa fa-address-card fa-5x"></i>My text below icon</a>

</li>
  <li><a class="btn btn-info btn-lg sharp" href="http://www.google.com" target="_blank"><i class="fa fa-address-book fa-5x"></i>My text below icon  </a></li>
</ul>

这是创建一个匿名结构(一个名为typedef struct { struct list_item *next; void *data; } list_item; ),然后为该匿名结构提供typedef&#39; d name list_item。如果你需要自我引用,你应该这样做:

list_item

您还有其他未提及的错误。例如,您尝试取消引用typedef struct list_item { struct list_item *next; void *data; } list_item; 指针:

NULL

第一次向列表中添加内容时,list_item *last = l->first; for(i = 0; i < l->len; i++){ last = last->next; } l->first,表示NULL为NULL,last为0,因此循环不会执行。然后你做:

l->len

取消引用last->next = item; 指针并使您的应用程序崩溃。

假设您解决了这个问题,那么您将在此循环中点击下一个问题:

NULL

完成此循环后,最后一次将是for(i = 0; i < l->len; i++){ last = last->next; } 。并且NULL将被执行并再次导致段错误。实际上你需要停一个短路,以便正确分配下一个指针。

如果替换:

last->next = item

使用:

int i;
list_item *last = l->first;
for(i = 0; i < l->len; i++){
    last = last->next;
}

然后事情会好得多。