我正在尝试使用链表创建背包程序,但是我遇到了一个我很想知道的问题。在几乎所有的函数中,我都会在不兼容的指针类型的同一行上遇到此错误,我对如何解决它感到困惑。我碰到的另一个问题是一个return makes integer from pointer without a cast
错误。以下是完整的代码和错误。错误在于knapsack.c
文件中,test_knapsack.c
仅出于测试目的给出主要功能示例。
错误
knapsack.c: In function ‘KnapsackRemove’:
knapsack.c:37:16: warning: return makes integer from pointer without a cast [-Wint-conversion]
return NULL;
^
knapsack.c:47:29: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
knapsack=(*present)->next;
knapsack.c:59:12: warning: return makes integer from pointer without a cast [-Wint-conversion]
return *knapsack;
^
knapsack.c: In function ‘KnapsackPrint’:
knapsack.c:69:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
temp=(*temp)->next;
^
knapsack.c: In function ‘KnapsackItemCount’:
knapsack.c:82:13: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
temp=(*temp)-> next;
^
knapsack.c: In function ‘KnapsackSize’:
knapsack.c:94:13: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
temp=(*temp)-> next;
背包
#include <stdio.h>
#include "knapsack.h"
#include <stdlib.h>
listitemptr KnapsackAdd(listitemptr *knapsack, int item){
if(knapsack == NULL){
listitemptr newer = (listitemptr)malloc(sizeof(listitemptr));
newer-> item = item;
newer-> count = 1;
newer-> next = NULL;
return newer;
}else{
listitemptr *temp = knapsack;
listitemptr previous = NULL;
while(temp!= NULL){
if((*temp)->item == item){
(*temp)->count=(*temp)->count+1;
break;
}
previous = *temp;
*temp = (*temp)->next;
}
if(temp == NULL){
listitemptr newer = (listitemptr)malloc(sizeof(listitemptr));
newer->item = item;
newer->count =1;
newer->next = NULL;
previous->next = newer;
return newer;
}
return *temp;
}
}
int KnapsackRemove(listitemptr *knapsack, int item){
if(knapsack==NULL)
return NULL;
listitemptr *present = knapsack;
listitemptr previous = NULL;
while(present != NULL){
if((*present)->item == item){
if((*present)-> count > 1){
(*present)->count=(*present)->count-1;
}else{
if(previous==NULL){
knapsack=(*present)->next;
}else{
previous->next=(*present)->next;
free(present);
}
}
break;
}
previous=*present;
*present=(*present)->next;
}
return *knapsack;
}
void KnapsackPrint(const listitemptr *knapsack){
if(knapsack == NULL)
printf("(nothing)\n");
else{
const listitemptr *temp = knapsack;
while(temp!= NULL){
printf("%d (%d), ",(*temp)->item, (*temp)->count);
temp=(*temp)->next;
}
printf("\n");
}
}
unsigned int KnapsackItemCount(const listitemptr *knapsack, int item){
if(knapsack== NULL)
return 0;
const listitemptr *temp = knapsack;
while(temp != NULL){
if((*temp)-> item== item)
return (*temp)-> count;
temp=(*temp)-> next;
}
return 0;
}
unsigned int KnapsackSize(const listitemptr *knapsack){
if(knapsack == NULL)
return 0;
const listitemptr *temp = knapsack;
unsigned int sum = 0;
while(temp!= NULL){
sum+= (*temp)-> count;
temp=(*temp)-> next;
}
return sum;
}
背包
/* knapsack.h
* implements simple knapsack data structure as a linked list
* NOTE: a function may update the value of input argument *knapsack if it changes the first node of the knapsack to another node. Such a change include the case when an item is added to an empty knapsack
*/
typedef struct listitem* listitemptr;
struct listitem {
int item; // actual int item
unsigned int count; // number of the same item in the knapsack; should be >= 1
listitemptr next; // pointer to next item
};
listitemptr KnapsackAdd(listitemptr *knapsack, int item);
int KnapsackRemove(listitemptr *knapsack, int item);
void KnapsackPrint(const listitemptr *knapsack);
unsigned int KnapsackItemCount(const listitemptr *knapsack, int item);
unsigned int KnapsackSize(const listitemptr *knapsack);
test_knapsack.c
#include "knapsack.h"
#include <stdio.h>
#include <assert.h>
int main(){
//knapsack k1
listitemptr head=KnapsackAdd(NULL,10);
KnapsackAdd(&head,-20);
KnapsackAdd(&head,10);
KnapsackAdd(&head,15);
KnapsackAdd(&head,-20);
KnapsackAdd(&head,10);
KnapsackPrint(&head);
int count=KnapsackItemCount(&head,10);
assert(count==3);
count=KnapsackItemCount(&head,8);
assert(count==0);
count=KnapsackSize(&head);
assert(count==6);
//knapsack2
listitemptr head2=KnapsackAdd(NULL,5);
KnapsackAdd(&head2,10);
KnapsackAdd(&head2,15);
KnapsackAdd(&head2,20);
KnapsackAdd(&head2,-5);
KnapsackPrint(&head2);
KnapsackRemove(&head2,15);
count=KnapsackSize(&head2);
assert(count==4);
count=KnapsackItemCount(&head2,15);
assert(count==0);
KnapsackRemove(&head2,10);
count=KnapsackSize(&head2);
assert(count==3);
KnapsackAdd(&head,10);
count=KnapsackSize(&head2);
assert(count==3);
count=KnapsackSize(&head);
assert(count==7);
return 0;
}
看线
temp=(*temp)->next;
temp
定义为const listitemptr *temp
,表示其类型为const listitemptr *
。
要找到的类型(*temp)->next
,我们可以看一下它的各个部分。我们已经知道temp
是a const listitemptr *
,因此取消引用它会导致listitemptr
。
看你的来源,我们可以再找个类型next
,
struct listitem {
listitemptr next; // pointer to next item
};
现在我们可以看到next
,因此(*temp)->next
具有类型listitemptr
。
因此,您将分配listitemptr
给const listitemptr *
。
看来这些错误中的大多数是由于混淆listitemptr
指向的指针引起的listitemptr*
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句