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

代码报错的原因是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函数,并且输出链表数据到控制台。

print(pCurrent);
->
printLinkList(pCurrent);

根据错误提示,你把print改成错误提示的那个
改法如下:

PrintLinkList(pCurrent);
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7737566
  • 除此之外, 这篇博客: c语言链表的基本操作中的 linklist.c文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    #include<stdlib.h>
    #include"linklist.h"
    
    
    linklist list_create(){
    	linklist H;
    	H=(linklist)malloc(sizeof(linklist));
    	if(H==NULL){
    		printf("malloc failed\n");
    		return H;
    	}
    	H->data=0;
    	H->next=NULL;
    	return H;
    }
    
    int list_tail_insert(linklist H,ElemType value){
    	linklist p,q;
    	//malloc
    	if(((p=(linklist)malloc(sizeof(linklist)))==NULL)){
    		printf("malloc failed \n");
    		return -1;
    	}
    	p->data=value;
    	p->next=NULL;
    
    	//find tail node
    	q=H;
    	while(q->next !=NULL){
    		q=q->next;
    	}
    	//insert
    	q->next=p;
    	return 0;
    }
    
    int list_show(linklist H){
    	linklist p;
    	if(H==NULL){
    		printf("H is NULL\n");
    		return -1;
    	}
    	p=H;
    	while(p->next != NULL){
    		printf("%d ",p->next->data);
    		p=p->next;
    	}
    	puts(" ");
    	return 0;
    
    }
    linklist list_get(linklist H ,int pos){
    	linklist p;
    	int i;
    	if(H==NULL){
    		printf("H is NULL\n");
    		return NULL;
    	}
    	if(pos==-1){
    		return H;
    	}
    	if(pos<-1){
    		printf("pos is invalid\n");
    		return NULL;
    	}
    	p=H;
    	i=-1;
    	while(i<pos){
    		p=p->next;
    		if(p==NULL){
    			printf("pos is invalid\n");
    			return NULL;
    		}
    		i++;
    	}
    	return p;
    
    }
    
    int list_insert(linklist H ,ElemType value,int pos){
    	linklist p;
    	linklist q;
    
    	if(H==NULL){
    		printf("H is NULL\n");
    		return -1;
    	}
    	//new node p
    	if((p=(linklist)malloc(sizeof(linklist)))==NULL){
    		printf("malloc faile\n");
    		return -1;
    	}
    	
    	p->data=value;
    	p->next=NULL;
    //local node q
    
    	q=list_get(H,pos-1);
    	if(q==NULL){
    		return -1;
    	}
    	p->next=q->next;
    	q->next=p;
    
    	return 0;
    }
    
    int list_delete(linklist H,int pos){
    	linklist p;
    	linklist q;
    
    	if(H==NULL){
    		printf("H is NULL\n");
    		return -1;
    	}
    
    	p=list_get(H,pos-1);
    	if(p==NULL){
    		return -1;
    	}
    	if(p->next==NULL){
    		printf("delete pos is invaild");
    	}
    	
    	q=p->next;
    	p->next=q->next;//p->next=p->next->next
    	
    	printf("free:%d\n",q->data);
    	free(q);
    	q=NULL;
    	return 0;
    
    }
    
    linklist list_free(linklist H){
    	linklist p;
    	if(H==NULL){
    		printf("H is null\n");
    		return NULL;
    	}
    	p = H;
    	printf("free:\n");
    	while(H !=NULL){
    		p=H;
    		printf("%d ",p->data);
    		H=H->next;
    		free(p);
    	}
    	puts("");
    
    	return NULL;
    }
    
    int list_reverse(linklist H){
    	linklist p,q;
    	if(H==NULL){
    		printf("H id null\n");
    		return -1;
    	}
    
    	if((H->next==NULL)||(H->next->next==NULL)){
    		return 0;
    	}
    	
    	p=H->next->next;
    	H->next->next=NULL;
    
    	while(p!=NULL){
    	q=p;
    	p=p->next;
    
    	q->next=H->next;
    	H->next=q;
    	}
    	
    	return 0;
    }
    
    linklist list_adjmax(linklist H,ElemType *value){
    	linklist p,q,r;
    	ElemType sum;
    
    	if(H==NULL){
    		printf("H is NULL\n");
    		return NULL;
    	}
    	if(H->next==NULL||H->next->next==NULL||H->next->next->next==NULL){
    		return H;
    	}
    
    	q=H->next;
    	p=q->next;
    	r=q;
    	
    	sum=q->data+p->data;
    	while(p->next!=NULL){
    		p=p->next;
    		q=q->next;
    
    		if(sum<q->data+p->data){
    			sum=q->data+p->data;
    			r=q;
    		}
    		
    	}
    	*value=sum;
    	return r;
    }
    
    int list_merge(linklist H1,linklist H2){
    	linklist q,p,r;
    	if(H1==NULL||H2==NULL){
    		printf("H1 || H2 is NULL\n");
    		return -1;
    	}
    
    	p=H1->next;
    	q=H2->next;
    	r=H1;
    	H1->next=NULL;
    	H2->next=NULL;
    
    	while(p&&q){
    		if(p->data<q->data){
    		r->next=p;
    		p=p->next;
    		r=r->next;
    		r->next=NULL;
    		}else{
    		r->next=q;
    		q=q->next;
    		r=r->next;
    		r->next=NULL;
    		}
    	}
    	if(p==NULL){
    		r->next=q;
    	}else{
    		r->next=p;
    	}
    	return 0;
    
    }

参考,修改如下:

 
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);
}