编译此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;
}
答案 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中的链表有很多示例代码。