链表数据结构出错

时间:2016-06-02 21:49:02

标签: c

编译此c程序时出现问题,即创建链接列表结构并使用户在列表的开头或末尾插入值。 在编译时我收到了这个错误:

    list.c: In function ‘list_insert_up’:
    list.c:49:6: error: incompatible types when assigning to type ‘list_t’ from type ‘struct list_t *’
    *ptr=allocate(ptr);
enter code here

这是代码:

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


struct list_t{
    int val;
    struct list_t *next;

};

typedef struct list_t list_t;

list_t *head=NULL;
list_t *curr=NULL;

// FUNCTIONS

list_t*
allocate(list_t *ptr){
    return malloc(sizeof(list_t));
}

void
deallocate(list_t *ptr){
    free(ptr);
}

list_t*
list_block_create(list_t *ptr, int value){
    list_t *curr=ptr;
    ptr->val=value;
    ptr->next=NULL;
    head=curr=ptr;
    printf("--Block created successfully!--\n");
}

void
list_print(list_t *ptr){
    size_t i=0;
    while(ptr!= NULL){
        printf("%i\n",ptr->val);
        ptr=ptr->next;
    }
    printf("--List printed successfully!--\n");
}

list_t*
list_insert_up(list_t *ptr,int value){
    *ptr=allocate(ptr);
    ptr->val=value;
    ptr->next=head;
    head=ptr;

}


// MAIN

int
main(){

    list_t *ptr=allocate(ptr);

    list_block_create(ptr,1);
    list_print(ptr);
    list_insert_up(ptr,2);
    list_print(ptr);

    return 0;
}

3 个答案:

答案 0 :(得分:0)

以下是问题(错误消息的来源):

list_insert_up(list_t *ptr,int value){
    *ptr=allocate(ptr); // left hand: list_t, right hand: list_t *
    ...
}

当您在ptr之前放置*时,您将其解除引用。您尝试将ptr设置为指针,因为allocate()返回一个指针(这装配了错误消息)。我不能说代码中没有其他问题。

你需要这样的东西:

list_insert_up(list_t **ptr,int value){
    *ptr=allocate(*ptr);
    (*ptr)->val=value;
    (*ptr)->next=head;
    head=*ptr;
}

为什么你需要这样的东西?因为您想要更改指针(地址)而不是指针指向的值。

答案 1 :(得分:0)

将您的list_insert_up()功能更改为:

list_t*
list_insert_up(list_t **ptr,int value){
    (*ptr)=allocate(*ptr);
    (*ptr)->val=value;
    (*ptr)->next=head;
    head=*ptr;
}

然后,在list_insert_up(&ptr,2);函数中以main()方式调用此函数。 您将得到正确的答案,因为您想要更改指针的值,因此您需要将指向该指针的指针作为参数传递。或者你可以选择退货。

答案 2 :(得分:0)

你必须解决一些问题:

使用curr令人困惑,首先将其定义为全局变量,然后在list_block_create内屏蔽它。这可能不是你想要的。

list_t*
allocate(){
    return (list_t*) malloc(sizeof(list_t));
}

list_t*
list_insert_up(list_t *ptr,int value){
    list_t* ptr2=allocate();
    ptr2->val=value;
    ptr2->next=ptr->next;
    ptr->next=ptr2;
    return ptr2;  /* not really needed, the function might return void */
}

实际上使用而不是list_insert_up

list_t*
list_insert_top(int value){
    list_t* ptr=allocate();
    ptr->val=value;
    ptr->next=head;
    head=ptr;
    return ptr;  /* not really needed, the function might return void */
}

list_t*
list_block_create(list_t *ptr, int value){
    head=ptr;
    ptr->val=value;
    ptr->next=NULL;
    printf("--Block created successfully!--\n");
    return ptr;  /* not really needed, the function might return void */
}

您可能最好更改代码的逻辑,例如删除全局变量。如果你这样做,你可能需要保留你的函数的返回值(我引用的不需要的东西,就像现在的情况一样)。 C中的链表有很多示例代码。