萌新编程出现[Error] ld returned 1 exit status大佬帮忙看看哪里错了
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define TITLE "学生信息管理系统"
#define MAX 100
#define MENU_MAIN_COUNT 7
#define MENU_SEARCH_COUNT 2
typedef struct student{
char name[MAX];//定义学生姓名
char num[MAX];//定义学生学号
char sex[MAX];//定义学生性别
char age;
char major;
struct student *next;//指向下一学生的指针
}stu;
stu *head=NULL;//定义头节点,使之为空
void input_record();//创建学生信息
void show_record();//显示学生信息
void search_record();//查询学生信息
void add_record();//添加学生信息
void delete_record();//删除学生信息
void save_to_file();//保存文件
void exit_system();//返回
void search_by_num();//通过学号查找
void search_by_name();//通过姓名查找
void search_exit();//退出系统
void create_stu_by_input(stu *pNewStu);//通过输入为student赋值
void print_table_row(stu *p);//显示一条学生记录
void print_menu_title(char *title);//显示菜单标题
void clear_record();//清空所有记录
void print_menu_main();// 显示主菜单
void print_menu_title(const char *title);//显示菜单标题
void print_menu_title(const char *title)
{
printf("========================================\n");
printf("************%s************\n",title);
printf("----------------------------------------\n");
}//显示菜单标题的处理函数
void (*menu_main_func[]) () =
{
input_record,
show_record,
search_record,
add_record,
delete_record,
save_to_file,
exit_system
};//存储主菜单7个功能函数地址的函数指针数组
void print_menu_main()
{
int selected=0;//用户选择的菜单项
char menu_main[]=
"| |\n"
"| 1 输入学生信息 |\n"
"| 2 显示学生信息 |\n"
"| 3 查询学生信息 |\n"
"| 4 添加学生信息 |\n"
"| 5 删除学生信息 |\n"
"| 6 保存文件 |\n"
"| 7 退出系统 |\n"
"| |\n";//主菜单显示的字符
system("cls");//做清屏处理。
print_menu_title(TITLE);//输出标题。
printf(menu_main);//显示菜单字符。
printf("=========================================\n");
while(!(selected>=1&&selected<=MENU_MAIN_COUNT))
{
printf(">请选择:");
scanf("%d",&selected);
if(selected>=1&&selected<=MENU_MAIN_COUNT){
break;
}
printf("\n>输入错误!(注:请选择1-%d)\n",MENU_MAIN_COUNT);
}//用户选择及错误选择时做循环处理,直到用户选择正确。
menu_main_func[selected-1]();//根据用户的选择,调用相应的功能菜单。
}
void(*menu_search_func[])()=
{
search_by_num,
search_by_name,
search_exit};//存储查询功能函数的函数指针数组
stu *get_last_student(stu *p)
{
if(p->next==NULL)
{
return p;
}
else
{
return get_last_student(p->next);
}
}//取得链表最后一个值的函数
int main(){
print_menu_main();//显示主菜单等待用户输入
}
void input_record()
{
char continue_input='N';
stu *pLastStu=NULL;
stu *pNewStu=(stu*)malloc(sizeof(stu));//创建一个stu
pNewStu->next=NULL;
create_stu_by_input(pNewStu);//为创建的stu赋值
if(head==NULL)
{
head=pNewStu;
}//如果链表头为空,那么该信息为第一个
else
{
pLastStu=get_last_student(head);
pLastStu->next=pNewStu;
}//否则为最后一个信息
printf("继续输入学生信息?(Y继续,N返回菜单)");//询问用户是否继续输入
getchar();
continue_input=getchar();
if(continue_input=='n'||continue_input=='N')
{
print_menu_main();
}//如果否返回主菜单
else
{
input_record();
}//否则再次调用
}
void create_stu_by_input(stu* pNewStu){
printf(">请输入学生信息(注:最大长度是10个字符):\n");
printf("学号:");
scanf("%s",pNewStu->num);
printf("姓名:");
scanf("%s",pNewStu->name);
printf("性别:");
scanf("%s",pNewStu->sex);
printf("年龄;");
scanf("%s",&(pNewStu->age));
printf("专业班级:");
scanf("%s",&(pNewStu->major));}//提示用户输入学生信息的函数
void search_record()
{
int selected =0;//用户选择的菜单项
char menu_search[]=
"| |\n"
"| 1 按照学号查询 |\n"
"| 2 按照姓名查询 |\n"
"| 4 返回上级菜单 |\n"
"| |\n";//查询子系统显示的字符
system("cls");//清屏
print_menu_title("查询学生信息");//输出子菜单名
printf(menu_search);//输出子系统显示的字符
printf("========================================\n");
while (!(selected>=1&&selected<=MENU_SEARCH_COUNT))
{
printf(">请选择:");
scanf("%d",&selected);
if(selected>=1&&selected<=MENU_SEARCH_COUNT)
{
break;
}
printf("\n>输入错误!(请选择1-%d)\n)",MENU_SEARCH_COUNT);//用户选择及错误选择时做循环处理,直到用户选择正确。
}
menu_search_func[selected-1]();//调用用户选择项所对应的函数
}
void search_by_num()//通过学号查询
{
char num[MAX];
char continue_input='N';
stu *p=head;
int isfound=0;
printf(">请输入学生学号:");//提示用户输入
scanf("%s",num);
printf("\n>查找[%s]...\n",num);
while(p!=NULL)
{
if(strcmp(p->num,num)==0)
{
isfound=1;
break;//学号唯一,查到跳出循环
}
p=p->next;
}
if(!isfound)
printf("\n没有找到结果!\n");
printf("继续查找?(Y继续,N返回)");
getchar();
continue_input=getchar();
if(continue_input=='Y'||continue_input=='y')
{
search_by_num();// 继续调用查找
}
else
{
search_record();//返回菜单
}
}
void search_by_name()//通过姓名查找
{
char name[MAX];
char continue_input='N';
stu *p=head;
int isfound=0;
printf(">请输入学生姓名:");//提示用户输入
scanf("%s",name);
printf("\n>查找[%s]...\n",name);
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
print_table_row(p);
isfound=1;//姓名不唯一,查询到最后一个
}
p=p->next;
}
if(!isfound)
printf("\n没有找到结果!\n");
printf("继续查找?(Y继续,N返回)");
getchar();
continue_input=getchar();
if(continue_input=='Y'||continue_input=='y')
{
search_by_name();//继续调用查找
}
else
{
search_record();//返回菜单
}
}
void search_exit()//退出子菜单函数
{
print_menu_main();//返回主菜单
}
void print_title(char *title)
{printf("=================================\n");
printf("| %s\n,title");
printf("---------------------------------\n");}//菜单标题处理函数
void print_table_head()
{
printf("+--------------+----------+----------+----+----+----+------+\n");
printf("| 学号 | 姓名 | 性别 |年龄|专业班级|\n");
printf("+--------------+----------+----------+----+----+----+------+\n");//学生信息表格头部函数
}
void print_table_row(stu *p)
{
printf("|%14s|%10s|%10s|%4s|%10s|\n",
p->num,p->name,p->sex,p->age,p->major);//显示一个学生的记录
}
void print_table_buttom()
{
printf("+--------------+----------+----------+----+----+----+------+\n");//学生信息表格尾部函数
}
void add_record()//添加学生信息函数
{
stu *p=head;
char num [MAX];
char continue_input='N';
printf("请输入要添加的学生学号:");//提示用户输入
scanf("%s",num);
while(p!=NULL)
{
if(strcmp(p->num,num)==0)
{
break; //如果找到,停止循环
}
p=p->next;
}
if(p==NULL)
{printf("没有学号是[%s]的学生.",num);//如果没有,输入提示
}
else
{
create_stu_by_input(p);//否则更新
}
printf("继续添加吗?(Y继续,N返回菜单)");
getchar();
continue_input=getchar();
if (continue_input=='n'||continue_input=='N')
{
print_menu_main();
} //如果输入n返回主菜单
else{
add_record();//否则继续
}
}
void delete_record()
{
stu *p=head;
stu *pPre=NULL;
char num[MAX];
char continue_input='N';
printf("请输入要删除的学生学号:");//提示用户输入
scanf("%s",num);
while (p!=NULL)
{
if(strcmp(p->num,num)==0)
{
break; //如果找到,停止循环
}
p=p->next;
}
if(p==NULL)
{
printf("没有学号是[%s]的学生。",num);//如果为空,输出提示
}
else
{
printf("确认要删除学号为[%s]的学生吗?(Y确定,N取消)",p->num,p->name);
getchar();
continue_input=getchar();
if(continue_input=='y'||continue_input=='Y');
{
pPre=head;
if(pPre==p)
{
head=p->next;//如果p为头节点,直接删除,头节点改为其后继节点
free(p);
}
else
{
while (pPre !=NULL)
{
if(pPre->next==p)//找到p的前驱节点
{
pPre->next=p->next;//p的前驱的next指针指向p的next
free(p);//释放p节点
break;
}
pPre=pPre->next;
}
}
printf(">删除成功!\n");
}
}
printf("继续删除吗?(Y继续,N返回菜单)");
getchar();
continue_input=getchar();
if(continue_input=='n'||continue_input=='N')
{
print_menu_main();//返回主菜单
}
else{
delete_record();//继续删除
}
}
void clear_record(stu *p)
{
if (p==NULL)
{
return;//如果为空,返回
}
if(p->next==NULL)
{
free(p);//如果next指针为空,删除该节点
}
else
{
clear_record(p->next);//再次调用本函数,以结构体next指向的节点作为参数
free(p);//删除当前节点
p=NULL;//将指针置空
}
}
void save_to_file()//保存到文件函数
{
FILE *fp;
char file[100];
stu *p=head;
printf("请输入文件名:(须带有文件格式)");//提示用户输入
scanf("%s",file);
fp=fopen(file,"w");
while(p!=NULL)
{
fprintf(fp,"%s,%s,%s,%d,%d,%d,%d\n",
p->num,p->name,p->sex,p->age,p->major);
p=p->next;//保存的信息内容
}
fclose(fp);
printf("保存成功!\n按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}
void exit_system()//退出系统函数
{
clear_record(head);//释放整个链表
exit(0);
}