海绵宝宝最爱派大星 2021-06-19 23:46 采纳率: 0%
浏览 17

我把代码放在一个文件时运行是成功的,但是当我把它分开形成项目文件时会出现编译错误

这个是我的头文件student.h文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//初始化所有函数
void SystemMenu();//菜单 
void KeyRecive();
void InsertNode();// 插入节点 
struct Node* CreatNode();
struct Node* CreatNewNode(struct Student data);
void CreatNodeList(struct Node* HeadNode, struct Student data); //创建链表 
void deletestudent();//删除信息 
void deletenode(struct Node* headnode, char* name);//删除节点 
struct Node* SearchNode(struct Node* StudentNode, char* name);//
void PrintNode(struct Node* StudentNode);//打印节点 
void PrintList(struct Node* StudentNode);//打印链表 
void ReadFromFile(char* filename, struct Node* StudentNode);//从文件中读取数据 
void SaveFile1(char* filename, struct Node* StudentNode);
struct Node* StudentNode;
char S1[5] = { 's','.','t','x','t' };//?
struct Student {
    char name[20];//名字
    int age;//年龄
    char tel[20];//电话
    char addr[20];//住址
};
struct Node {
    struct Student data;
    struct Node* Next;
};

 

这个是我的主函数文件main.c文件

#include"student.h"
#include"do.c"
int main(void) 
{
    StudentNode = CreatNode();
    ReadFromFile(S1,StudentNode);
    while (1) 
    { 
        SystemMenu();
        KeyRecive();
        system("pause");
        system("cls");    
    }
}

这是我的do.c文件

void SystemMenu(){
    printf("-----------------------------学生信息管理系统--------------------------------------\n");
    printf("\t\t\t0.插入信息\n");
    printf("\t\t\t1.浏览信息\n");
    printf("\t\t\t2.删除信息\n");
    printf("\t\t\t3.修改信息\n");
    printf("\t\t\t4.查找信息\n");
    printf("\t\t\t5.退出系统\n");
    printf("-----------------------------------------------------------------------------------\n");

}
void KeyRecive(){
    int x;//我的选择    
    struct Student s;
    scanf("%d", &x);
    switch (x)
    {
    case 0:
        InsertNode();//增加学生信息 
        SaveFile1(S1, StudentNode);
        printf("插入操作执行完成!-------------");
        break;
    case 1:
        printf("\t【浏览信息】\n");
        PrintNode(StudentNode);//输出所有学生的信息 
        printf("浏览操作执行完成--------------");
        break;
    case 2:
        printf("\t【删除信息】\n");
        deletestudent();
        SaveFile1(S1, StudentNode);//删除某个学生的信息 
        printf("删除操作执行完成---------------");
        break;
    case 3:
        printf("\t【更改信息】\n");
        printf("请输入更改的姓名:");
        scanf("%s", &s.name);
        if (SearchNode(StudentNode, s.name) == NULL) {// ?
            printf("未找到相关信息!\n");
        }
        else
        {
            struct Node* s1 = SearchNode(StudentNode, s.name);
            printf("请输入新的学生信息");
            printf("请输入同学姓名,年龄,电话,住址");
            scanf("%s%d%s%s", &s1->data.name, &s1->data.age, &s1->data.tel, &s1->data.addr);
            printf("修改操作执行完成---------------");
            SaveFile1(S1,StudentNode);
        }
        break;
    case 4:
        printf("\t【查找信息】\n");
        printf("请输入查找的姓名:");
        scanf("%s",&s.name);
        if (SearchNode(StudentNode, s.name) == NULL) {
            printf("未找到相关信息!\n");
        }
        else
        {
            PrintList(SearchNode(StudentNode, s.name));
            printf("查找操作执行完成---------------");
        }
        
        break;
    case 5:
        printf("\t【退出系统】\n");
        exit(0);
        break;
    
    default:printf("输入数据有误,重新输入");KeyRecive();
        break;
    }
}
void InsertNode() {//插入函数
    int x,i;
    struct Student S;
    printf("请输入学生个数");
    scanf("%d",&x);
    for (i=1;i<=x; i++) {
        printf("请输入第%d个同学姓名,年龄,电话,住址",i);
        scanf("%s%d%s%s", &S.name, &S.age, &S.tel, &S.addr);
        CreatNodeList(StudentNode,S);
    }
}
struct Node* CreatNode() //建立头节点
{
    struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));
    HeadNode->Next = NULL;
    return HeadNode;
}
struct Node* CreatNewNode(struct Student data) {//建立新结点函数
    struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
    NewNode->data = data;
    NewNode->Next = NULL;
    return NewNode;
}
void CreatNodeList(struct Node* HeadNode, struct Student data) {//建立新节点并插入数据
    struct Node* NewNode = CreatNewNode(data);
    NewNode->Next = HeadNode->Next;
    HeadNode->Next = NewNode;
 }
void deletestudent() {//删除节点
    char name[10];
    printf("请输入需要删除的学生名字");
    scanf("%s",&name);
    deletenode(StudentNode,name);
}
void deletenode(struct Node* headnode, char *name) {//删除节点
    struct Node* posnode = headnode->Next;
    struct Node* posnodefront = headnode;
    if (posnode == NULL) {
        printf("数据为空,无法删除");

    }
    else
    {
        while (strcmp(posnode->data.name,name)) {
            posnodefront = posnode;
            posnode = posnodefront->Next;
            if (posnode == NULL) 
            {   
                printf("未找到指定位置,无法删除"); 
                return; 
            }
        }
        posnodefront->Next = posnode->Next;
        free(posnode);
    }
}
struct Node* SearchNode(struct Node* StudentNode, char* name) 
{//查找节点
    struct Node* pMove = StudentNode->Next;
    if (pMove == NULL) 
    { 
        printf("未找到该学生");
        return(pMove);
    }
    else
    {
        while (strcmp(pMove->data.name, name)) 
        {
            pMove = pMove->Next;
            if (pMove == NULL)break;
        }
        return pMove;
    }
}
void PrintList(struct Node* StudentNode) 
{//打印单个节点
    printf("姓名\t年龄\t电话\t住址\n");
    printf("%s\t%d\t%s\t%s\n",StudentNode->data.name,StudentNode->data.age,StudentNode->data.tel,StudentNode->data.addr);
}
void PrintNode(struct Node* StudentNode)
{//浏览信息
    struct Node* pow = StudentNode->Next;
    printf("姓名\t年龄\t电话\t住址\n");
    while(pow)
    {
        printf("%s\t%d\t%s\t%s\n",pow->data.name,pow->data.age,pow->data.tel,pow->data.addr);
        pow = pow->Next;
    }
}
void ReadFromFile(char *filename,struct Node* StudentNode)
{
    FILE* fp = fopen(filename, "r");
    if (fp == NULL) 
    {
        fp = fopen(filename, "w");
    }
    struct Student data;
    while (fscanf(fp, "%s\t%d\t%s\t%s\n", &data.name, &data.age,&data.tel, &data.addr) != EOF) 
    {
        CreatNodeList(StudentNode, data);
        memset(&data, 0, sizeof(data));
    }
    fclose(fp);
}
void SaveFile1(char* filename, struct Node* StudentNode) 
{
    FILE* fp = fopen(filename,"w");
    struct Node* pow = StudentNode->Next;
    while (pow) 
    {
        fprintf(fp,"%s\t%d\t%s\t%s\n", pow->data.name, pow->data.age, pow->data.tel, pow->data.addr);
        pow = pow->Next;
    }
    fclose(fp);
}

会出现如下图的错误

 

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-16 17:59
    关注

    参考GPT和自己的思路:

    根据您提供的信息和错误提示,可能是您在main.c文件中包含了student.h头文件,但没有在编译时将do.c文件加入编译器参数中,导致编译器无法找到do.c文件中使用到的函数定义。您可以尝试在编译时将do.c文件一起编译,例如使用以下命令进行编译:

    gcc main.c do.c -o main.exe

    其中,main.c和do.c分别是您的主函数文件和函数实现文件,-o选项指定输出的可执行文件名为main.exe。您可以根据自己的操作系统和编译器,选择相应的编译命令对代码进行编译。

    评论

报告相同问题?

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物