come_on_haha 2023-07-20 14:31 采纳率: 33.3%
浏览 57
已结题

c语言的企业链表学习中的问题

请问下列代码报错的原因在哪?

img


以下是企业链表的案例,为企业链表.c文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkList.h"

typedef struct PERSON {
    LinkNode node;
    char name[64];
    int age;
}Person;

void MyPrint(LinkNode* data) {
    Person* p = (Person*)data;
    printf("Name:%s Age:%d \n", p->name, p->age);
}

int main(void) {
    //创建链表
    LinkList* list = Init_LinkList();
    //创建数据
    Person p1, p2, p3, p4, p5;
    strcpy(p1.name, "aaa");
    strcpy(p2.name, "bbb");
    strcpy(p3.name, "ccc");
    strcpy(p4.name, "ddd");
    strcpy(p5.name, "eee");

    p1.age = 10;
    p2.age = 20;
    p3.age = 30;
    p4.age = 40;
    p5.age = 50;

    //将结点插入链表
    Insert_LinkList(list, 0, (LinkNode*) & p1);
    Insert_LinkList(list, 0, (LinkNode*)&p2);
    Insert_LinkList(list, 0, (LinkNode*)&p3);
    Insert_LinkList(list, 0, (LinkNode*)&p4);
    Insert_LinkList(list, 0, (LinkNode*)&p5);

    //打印
    Print_LinkList(list, MyPrint);
    //删除结点
    Remove_LinkList(list, 2);

    //打印
    printf("-----------------\n");
    Print_LinkList(list, MyPrint);
    
    //释放链表内存
    FreeSpace_LinkList(list);

    system("pause");
    return 0;
}

以下是LinkList.c文件

#include "LinkList.h"




//初始化链表
LinkList* Init_LinkList() {

    LinkList* list = (LinkList*)malloc(sizeof(LinkList));
    list->head.next = NULL;
    list->size = 0;
    return list;

}
//插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {
    if (list == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    if (pos < 0 || pos > list->size) {
        pos = list->size;
    }

    //查找插入位置

    LinkNode* pCurrent = &(list->head);
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }

    //插入新结点
    data->next = pCurrent->next;
    pCurrent->next = data;

    list->size++;
}
//删除
void Remove_LinkList(LinkList* list, int pos) {
    if (list == NULL) {
        return;
    }

    if (pos < 0 || pos >= list->size) {
        return;
    }
    //辅助指针变量
    LinkNode* pCurrent = &(list->head);
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }
    //删除结点
    pCurrent->next = pCurrent->next->next;

    list->size--;
}
//查找
int Find_LinkList(LinkList* list, LinkNode* data,COMPARENODE compare) {

    if (list == NULL) {
        return;
    }
    if (data = NULL) {
        return;
    }
    //辅助指针变量
    LinkNode* pCurrent = list->head.next;
    int index = 0;
    while (pCurrent != NULL) {
        if (compare(pCurrent, data == 0)) {
            break;
        }
        pCurrent = pCurrent->next;
        index++;
    }
    return index;
}
//返回链表大小
int Size_LinkList(LinkList* list) {

    return 0;
}
//打印
void Print_LinkList(LinkList* list) {
    if (list == NULL) {
        return;
    }
    //辅助指针
    LinkNode* pCurrent = list->head.next;
    while (pCurrent != NULL) {
        print(pCurrent);
        pCurrent = pCurrent->next;
    }

}
//释放链表内存
void FreeSpace_LinkList(LinkList* list) {
    if (list == NULL) {
        return;
    }
    
    free(list);

}

以下是头文件LinkList.h

#pragma once
#ifndef LINKLIST_H
#define LINKLIST_H



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

//链表小结点
typedef struct LINKNODE {
    struct LINKNODE* next;
}LinkNode;



//链表结点
typedef struct LINKLIST {
    LinkNode head;
    int size;

}LinkList;
//遍历函数指针
typedef void(*PRINTNODE)(LinkNode*);
//比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
//初始化链表
LinkList* Init_LinkList();
//插入
void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
//删除
void Remove_LinkList(LinkList* list,int pos);
//查找
int Find_LinkList(LinkList* list, LinkNode* data,COMPARENODE compare);
//返回链表大小
int Size_LinkList(LinkList* list);
//打印
void Print_LinkList(LinkList* list);
//释放链表内存
void FreeSpace_LinkList(LinkList* list);









#endif

  • 写回答

5条回答 默认 最新

  • isjiff 2023-07-20 14:34
    关注

    代码报错的原因是LinkList.h中定义的Print_LinkList函数在main函数中调用时,缺少了一个参数MyPrint。修改后的代码如下:

    
    c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 链表小结点
    typedef struct LINKNODE {
        struct LINKNODE* next;
    }LinkNode;
    
    // 链表结点
    typedef struct LINKLIST {
        LinkNode head;
        int size;
    }LinkList;
    
    // 遍历函数指针
    typedef void(*PRINTNODE)(LinkNode*);
    
    // 比较函数指针
    typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
    
    // 初始化链表
    LinkList* Init_LinkList();
    
    // 插入
    void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
    
    // 删除
    void Remove_LinkList(LinkList* list, int pos);
    
    // 查找
    int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare);
    
    // 返回链表大小
    int Size_LinkList(LinkList* list);
    
    // 打印
    void Print_LinkList(LinkList* list, PRINTNODE print);
    
    // 释放链表内存
    void FreeSpace_LinkList(LinkList* list);
    
    typedef struct PERSON {
        LinkNode node;
        char name[64];
        int age;
    }Person;
    
    void MyPrint(LinkNode* data) {
        Person* p = (Person*)data;
        printf("Name:%s Age:%d \n", p->name, p->age);
    }
    
    int main(void) {
        // 创建链表
        LinkList* list = Init_LinkList();
        
        // 创建数据
        Person p1, p2, p3, p4, p5;
        strcpy(p1.name, "aaa");
        strcpy(p2.name, "bbb");
        strcpy(p3.name, "ccc");
        strcpy(p4.name, "ddd");
        strcpy(p5.name, "eee");
    
        p1.age = 10;
        p2.age = 20;
        p3.age = 30;
        p4.age = 40;
        p5.age = 50;
    
        // 将结点插入链表
        Insert_LinkList(list, 0, (LinkNode*)&p1);
        Insert_LinkList(list, 0, (LinkNode*)&p2);
        Insert_LinkList(list, 0, (LinkNode*)&p3);
        Insert_LinkList(list, 0, (LinkNode*)&p4);
        Insert_LinkList(list, 0, (LinkNode*)&p5);
    
        // 打印
        Print_LinkList(list, MyPrint);
    
        // 删除结点
        Remove_LinkList(list, 2);
    
        // 打印
        printf("-----------------\n");
        Print_LinkList(list, MyPrint);
        
        // 释放链表内存
        FreeSpace_LinkList(list);
    
        return 0;
    }
    
    LinkList* Init_LinkList() {
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->head.next = NULL;
        list->size = 0;
        return list;
    }
    
    void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        if (pos < 0 || pos > list->size) {
            pos = list->size;
        }
    
        LinkNode* pCurrent = &(list->head);
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
    
        data->next = pCurrent->next;
        pCurrent->next = data;
    
        list->size++;
    }
    
    void Remove_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
    
        if (pos < 0 || pos >= list->size) {
            return;
        }
    
        LinkNode* pCurrent = &(list->head);
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
    
        pCurrent->next = pCurrent->next->next;
    
        list->size--;
    }
    
    int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) {
        if (list == NULL) {
            return 0;
        }
        if (data == NULL) {
            return 0;
        }
    
        LinkNode* pCurrent = list->head.next;
        int index = 0;
        while (pCurrent != NULL) {
            if (compare(pCurrent, data) == 0) {
                break;
            }
            pCurrent = pCurrent->next;
            index++;
        }
        return index;
    }
    
    int Size_LinkList(LinkList* list) {
        if (list == NULL) {
            return 0;
        }
        return list->size;
    }
    
    void Print_LinkList(LinkList* list, PRINTNODE print) {
        if (list == NULL) {
            return;
        }
    
        LinkNode* pCurrent = list->head.next;
        while (pCurrent != NULL) {
            print(pCurrent);
            pCurrent = pCurrent->next;
        }
    }
    
    void FreeSpace_LinkList(LinkList* list) {
        if (list == NULL) {
            return;
        }
        free(list);
    }
    
    

    注意,修改后的代码中,LinkList.h文件中的Print_LinkList函数参数增加了PRINTNODE print。这样,就可以正确调用Print_LinkList函数,并且输出链表数据到控制台。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月20日