调用“number::number(void)”没有匹配函数

no matching function for call to 'number::number(void)'

提问人:Rommel Bagasina 提问时间:10/1/2022 最后编辑:Allan WindRommel Bagasina 更新时间:10/1/2022 访问量:440

问:

您好,我正在尝试编写链表代码,但它不起作用。Malloc 在第一个指针和最后一个指针返回一个不匹配的函数来调用。代码如下:

#include <stdio.h>
#include <stdlib.h>
    
    typedef struct number{
        int x;
        struct number *next;
    }Number;
        
    Number *first = NULL, *temp = NULL, *last = NULL;
    
    void insert(int x){
    
        if(first==NULL){
            
            first= (Number)malloc(sizeof(Number));
            first->x=x;
            first->next = NULL;
            temp=first;
        }
        else{
            last = (Number)malloc(sizeof(Number));
            last->x = x;
            last->next = NULL;
            temp->next =last;
            temp=last;
        }
        
    
    }
    
    void printList(){
        Number *hold = first;
        
        while(hold!=NULL){
            printf("\n%d\n",hold->x);
            hold = hold->next;
        }
    }
    
    
    int main(){
        
        int size;
        printf("Enter size: ");
        scanf("%d",&size);
        Number *hold = first;
        
        printf("Enter value:\n");
        
        
        
        for(int i=0;i<size;i++){
            int x;
            scanf("%d",&x);
            insert(x);
        }
        
        printfList();
    }

这里可能有什么问题?

c 语法错误

评论


答:

1赞 Allan Wind 10/1/2022 #1
  1. 错误消息听起来像是用 c++ 而不是 c 编译器编译的。
  2. Number是 的 typedef,但您将其用作指针。在 c 中,我们不会投射 void 指针,所以就把它省略掉:struct Number
void insert(int x) {
    if(first==NULL){
        first = malloc(sizeof(Number));
        first->x=x;
        first->next = NULL;
        temp = first;
    } else {
        last = malloc(sizeof(Number));
        last->x = x;
        last->next = NULL;
        temp->next = last;
        temp = last;
    }
}
  1. printfList()应该是 .printList()

下面是一个执行示例:

Enter size: 3
Enter value:
1
2
3

1

2

3
  1. 我建议你去掉全局变量,并将它们传递到需要它们的函数中。,特别是 的实现细节。tempinsert()

  2. 此外,不一致的格式意味着我立即不信任您的代码。格式对于可读性很重要,那么为什么要让自己感到困难呢?

0赞 abdo Salm 10/1/2022 #2

问题是您声明为该行中的指针first

Number *first = NULL, *temp = NULL, *last = NULL;

但是当你尝试使用 时,会返回一个类型的指针,所以你应该把它转换为 not,你应该 cast into 。mallocmallocvoid(Number*)(Number)void pointerNumber pointer

所以而不是

first = (Number)malloc(sizeof(Number));

你应该做

first = (Number*)malloc(sizeof(Number));

参考 malloc() 手册作为 is 的原型malloc

void *malloc(size_t大小);

只是一个小小的语法错误,它不是

printfList();

它:

printList();

通过这些小的编辑,这是最终的代码:

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

typedef struct number{
    int x;
    struct number *next;
}Number;

Number *first = NULL, *temp = NULL, *last = NULL;

void insert(int x){

    if(first==NULL){

        first = (Number*)malloc(sizeof(Number));
        first->x=x;
        first->next = NULL;
        temp=first;
    }
    else{
        last = (Number*)malloc(sizeof(Number));
        last->x = x;
        last->next = NULL;
        temp->next =last;
        temp=last;
    }


}

void printList(){
    Number *hold = first;

    while(hold!=NULL){
        printf("\n%d\n",hold->x);
        hold = hold->next;
    }
}


int main(){

    int size;
    printf("Enter size: ");
    scanf("%d",&size);

    printf("Enter value:\n");



    for(int i=0;i<size;i++){
        int x;
        scanf("%d",&x);
        insert(x);
    }

    printList();
}

这是一些示例输出:

Enter size:5
 Enter value:
1
2
3
4
5

1

2

3

4

5
0赞 Fe2O3 10/1/2022 #3

你的“插入”逻辑(实际上是“附加”)是不稳定的。区域已分配,但返回的地址很快就会丢失。

void insert( int x ) {
    temp = malloc( sizeof *temp ); // Make a node
    /* omitting test for NULL */

    temp->x = x; // populate its members
    temp->next = NULL;

    if( first == NULL )
        first = temp; // all done!
    else
        last = last->next =  temp; // all done here, too!
}