在写一个学生学籍查询系统的程序,用单链表写了程序,大体上写完,但是查询功能和删除功能无法运行,求解答!!
#include
#include
#include
#include
#include
#define Len sizeof (struct NODE)
struct INFORMATION //基本信息
{
char number[15]; //学号
char name[20]; //姓名
char sex[10]; //性别
char dormitory[20]; //宿舍号码
char telephone[20]; //电话号码
};
struct GRADE //成绩信息
{
char number[15]; //学号
char name[20]; //姓名
char subnumber [10][10]; //课程编号
char subname [10][50]; //课程名称
float credit[10]; //学分
float usugrade[10]; //平时成绩
float testgrade[10]; //实验成绩
float scalgrade[10]; //卷面成绩
float ovalgrade[10]; //综合成绩
float finalcredit[10]; //实得学分
};
struct NODE
{
struct INFORMATION dataI; //数据域
struct GRADE dataG;
struct NODE * next; //指针域
};
typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;
node creatlist(); //建立表头
node creatnode(node head); //信息录入
void insertnode(node head, node newnode); //插入结点
void searchinfo (node head); //查找基本信息
void searchgrade(node head); //查找成绩信息
void search(node head); //信息查询
void delete(node head); //信息删除
void Freelink(node head); //释放链表
void menu(); //菜单函数
node creatlist() //建立表头
{
node headnode = (node)malloc(Len);
headnode -> next = NULL;
return headnode;
}
node creatnode(node head) //信息录入
{
int n, choice;
float g;
do{
system("cls");
printf("---------------------------------\n");
printf(" 请选择要录入的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
printf("\n");
switch (n)
{
case '1' :
{
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataI.number);
printf("姓名:");
scanf("%s", newnode->dataI.name);
printf("性别:");
scanf("%s", newnode->dataI.sex);
printf("宿舍号码:");
scanf("%s", newnode->dataI.dormitory);
printf("电话号码:");
scanf("%s", newnode->dataI.telephone);
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}while (1);
}break;
case '2' :
{
int i = 0;
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataG.number);
printf("姓名:");
scanf("%s", newnode->dataG.name);
for (i = 0; ; i++)
{
printf("课程编号:");
scanf("%s", newnode->dataG.subnumber[i]);
printf("课程名称:");
scanf("%s", newnode->dataG.subname[i]);
printf("学分:");
scanf("%f", &newnode->dataG.credit[i]);
printf("平时成绩:");
scanf("%f", &newnode->dataG.usugrade[i]);
printf("实验成绩:");
scanf("%f", &newnode->dataG.testgrade[i]);
printf("卷面成绩:");
scanf("%f", &newnode->dataG.scalgrade[i]);
if (newnode->dataG.testgrade[i] < 0)
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
else
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
g = newnode->dataG.ovalgrade[i];
if (g <= 100 && g >= 90)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
if (g < 90 && g >= 80)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
if (g < 80 && g >= 70)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
if (g < 70 && g >= 60)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
if (g < 60)
newnode->dataG.finalcredit[i] = 0.0;
printf("\n");
newnode->dataG.number[i+1] = '\0';
newnode->dataG.name[i+1] = '\0';
newnode->dataG.subnumber[i][10] = '\0';
newnode->dataG.subname[i][50] = '\0';
printf("----------------------------------\n");
printf(" 是否继续录入课程信息:\n");
printf(" 1:是\n");
printf(" 2:否\n");
printf("----------------------------------");
choice = getch();
printf("\n");
if (choice == '2')
break;
}
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
Sleep(500);
if (choice == '2')
break;
}while(1);
}break;
}
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回菜单\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
{
menu();
break;
}
}while(1);
return head;
}
void insertnode(node head, node newnode) //插入结点
{
newnode->next = head->next;
head->next = newnode;
}
void searchinfo (node head) //查找基本信息
{
system("cls");
int n, choice;
node p = head->next;
do{
printf("------------------------------\n");
printf(" 1:学号查找\n");
printf(" 2:姓名查找\n");
printf(" 3:宿舍查找\n");
printf("------------------------------");
n = getch();
printf("\n");
switch(n)
{
case'1':
{
char num[10];
while(1)
{
system("cls");
printf("请输入查找的学生学号:");
scanf("%s", num);
printf("\n");
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p->dataI.number[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.number,num) != 0)
p = p->next;
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}break;
case'2':
{
char name[20];
while(1)
{
system("cls");
printf("请输入查找的姓名:");
scanf("%s", name);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p->dataI.name[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.name,name) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
case'3':
{
char dorm[10];
while(1)
{
system("cls");
printf("请输入查找的宿舍号码:");
scanf("%s", dorm);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p->dataI.dormitory[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.dormitory,dorm) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
}
}while(1);
}
void searchgrade(node head) //查找成绩信息
{
system("cls");
int i = 0, choice;
float sum = 0.0;
char num[10];
node p = head->next;
while(1)
{
printf("请输入查找的学生的学号:");
scanf("%s", num);
if (p == NULL)
{
Sleep(1000);
printf("暂无数据!");
}
while(p != NULL)
{
printf("学号:%10s 姓名:%-20s\n",p->dataG.number, p->dataG.name);
while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
{
printf("课程编号:%-10s 课程名称:%-15s 综合成绩:%-5.1f 实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
sum += p->dataG.finalcredit[i];
i++;
}
printf("共修:%d 科 实得总学分为: %-5.1f\n", i, sum);
p = p->next;
}
system("cls");
printf("-----------------------------\n");
printf(" 是否继续查找:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("-----------------------------");
choice = getch();
if (choice == '2')
{
search(head);
break;
}
}
}
void search(node head) //信息查询
{
system("cls");
int n;
printf("---------------------------------\n");
printf(" 请选择要查询的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
system("cls");
printf("请稍后...");
Sleep(500);
printf("\n");
switch (n)
{
case '1' : searchinfo(head);break;
case '2' : searchgrade(head);break;
}
}
void Delete(node head) //信息删除
{
system("cls");
int n, flag = 0;
node pre = head;
node cure = head->next;
char name[20];
do
{
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",name);
Sleep(500);
system("cls");
if (pre->next == NULL)
printf ("暂无数据!无法删除!");
else
{
while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
{
pre = cure;
cure = pre->next;
}
if (pre->next == NULL)
printf("查无此人!");
else
{
pre->next = cure->next;
flag = 1;
if (flag)
printf("删除成功!");
else
printf("删除失败!");
Sleep(500);
free (cure);//释放链表
}
}
system("cls");
printf("| 是否继续删除 |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
Sleep(500);
if(n == '2')break;
}while(1);
}
void Freelink(node head) //释放链表
{
node p = head->next;
while(p)
{
head->next = p->next;//头指针指向下一个结点
free(p);//释放结点
p = head->next;
}
}
void over(node head)
{
system("cls");
int n;
printf("| 您确定要退出吗? |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
while(1)
{
switch(n)
{
case'1':
{
system("cls");
system("cls");
printf("正在退出...");
Sleep(1000);
system("cls");
printf("退出成功!");
system("cls");
printf("谢谢使用!");
Freelink(head);
exit(0);
break;
}
case'2':
{
menu();
break;
}
}
}
}
void menu()
{
node head = creatlist();
do
{
system("cls");
int n;
printf("--------------------------------------\n");
printf("| 学生学籍信息管理系统 |\n");
printf("--------------------------------------\n");
printf(" 1:信息录入\n");
printf(" 2:信息查询\n");
printf(" 3:信息删除\n");
printf(" 4:退出程序\n");
printf("--------------------------------------\n");
n = getch();
Sleep(500);
switch(n)
{
case'1': //信息录入
{
creatnode(head);
}break;
case'2': //信息查询
{
search(head);
}break;
case'3': //信息删除
{
Delete(head);
}break;
case'4': //退出程序
over(head);break;
}
}while(1);
}
int main()
{
menu();
}
有几个问题如下
========
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define Len sizeof (struct NODE)
struct INFORMATION //基本信息
{
char number[15]; //学号
char name[20]; //姓名
char sex[10]; //性别
char dormitory[20]; //宿舍号码
char telephone[20]; //电话号码
};
struct GRADE //成绩信息
{
char number[15]; //学号
char name[20]; //姓名
char subnumber [10][10]; //课程编号
char subname [10][50]; //课程名称
float credit[10]; //学分
float usugrade[10]; //平时成绩
float testgrade[10]; //实验成绩
float scalgrade[10]; //卷面成绩
float ovalgrade[10]; //综合成绩
float finalcredit[10]; //实得学分
};
struct NODE
{
struct INFORMATION dataI; //数据域
struct GRADE dataG;
struct NODE * next; //指针域
};
typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;
node creatlist(); //建立表头
node creatnode(node head); //信息录入
void insertnode(node head, node newnode); //插入结点
void searchinfo (node head); //查找基本信息
void searchgrade(node head); //查找成绩信息
void search(node head); //信息查询
void Delete(node head); //信息删除
void Freelink(node head); //释放链表
void menu(); //菜单函数
node creatlist() //建立表头
{
node headnode = (node)malloc(Len);
headnode -> next = NULL;
return headnode;
}
node creatnode(node head) //信息录入
{
int n, choice;
float g;
do{
system("cls");
printf("---------------------------------\n");
printf(" 请选择要录入的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
printf("\n");
switch (n)
{
case '1' :
{
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataI.number);
printf("姓名:");
scanf("%s", newnode->dataI.name);
printf("性别:");
scanf("%s", newnode->dataI.sex);
printf("宿舍号码:");
scanf("%s", newnode->dataI.dormitory);
printf("电话号码:");
scanf("%s", newnode->dataI.telephone);
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}while (1);
}break;
case '2' :
{
int i = 0;
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataG.number);
printf("姓名:");
scanf("%s", newnode->dataG.name);
for (i = 0; ; i++)
{
printf("课程编号:");
scanf("%s", newnode->dataG.subnumber[i]);
printf("课程名称:");
scanf("%s", newnode->dataG.subname[i]);
printf("学分:");
scanf("%f", &newnode->dataG.credit[i]);
printf("平时成绩:");
scanf("%f", &newnode->dataG.usugrade[i]);
printf("实验成绩:");
scanf("%f", &newnode->dataG.testgrade[i]);
printf("卷面成绩:");
scanf("%f", &newnode->dataG.scalgrade[i]);
if (newnode->dataG.testgrade[i] < 0)
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
else
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
g = newnode->dataG.ovalgrade[i];
if (g <= 100 && g >= 90)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
if (g < 90 && g >= 80)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
if (g < 80 && g >= 70)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
if (g < 70 && g >= 60)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
if (g < 60)
newnode->dataG.finalcredit[i] = 0.0;
printf("\n");
newnode->dataG.number[i+1] = '\0';
newnode->dataG.name[i+1] = '\0';
newnode->dataG.subnumber[i][10] = '\0';
newnode->dataG.subname[i][50] = '\0';
printf("----------------------------------\n");
printf(" 是否继续录入课程信息:\n");
printf(" 1:是\n");
printf(" 2:否\n");
printf("----------------------------------");
choice = getch();
printf("\n");
if (choice == '2')
break;
}
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
Sleep(500);
if (choice == '2')
break;
}while(1);
}break;
}
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回菜单\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
{
menu();
break;
}
}while(1);
return head;
}
void insertnode(node head, node newnode) //插入结点
{
newnode->next = head->next;
head->next = newnode;
}
void searchinfo (node head) //查找基本信息
{
system("cls");
int n, choice;
node p = head->next;
do{
printf("------------------------------\n");
printf(" 1:学号查找\n");
printf(" 2:姓名查找\n");
printf(" 3:宿舍查找\n");
printf("------------------------------");
n = getch();
printf("\n");
switch(n)
{
case'1':
{
char num[10];
while(1)
{
system("cls");
printf("请输入查找的学生学号:");
scanf("%s", num);
printf("\n");
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (!p || p->dataI.number[0] == '\0') ; //=============//
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.number,num) == 0)
//p = p->next; //=============//
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}break;
case'2':
{
char name[20];
while(1)
{
system("cls");
printf("请输入查找的姓名:");
scanf("%s", name);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (!p || p->dataI.name[0] == '\0') ; //=============//
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.name,name) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
case'3':
{
char dorm[10];
while(1)
{
system("cls");
printf("请输入查找的宿舍号码:");
scanf("%s", dorm);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p->dataI.dormitory[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.dormitory,dorm) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
}
}while(1);
}
void searchgrade(node head) //查找成绩信息
{
system("cls");
int i = 0, choice;
float sum = 0.0;
char num[10];
node p = head->next;
while(1)
{
printf("请输入查找的学生的学号:");
scanf("%s", num);
if (p == NULL)
{
Sleep(1000);
printf("暂无数据!");
}
while(p != NULL)
{
printf("学号:%10s 姓名:%-20s\n",p->dataG.number, p->dataG.name);
while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
{
printf("课程编号:%-10s 课程名称:%-15s 综合成绩:%-5.1f 实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
sum += p->dataG.finalcredit[i];
i++;
}
printf("共修:%d 科 实得总学分为: %-5.1f\n", i, sum);
p = p->next;
}
system("cls");
printf("-----------------------------\n");
printf(" 是否继续查找:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("-----------------------------");
choice = getch();
if (choice == '2')
{
search(head);
break;
}
}
}
void search(node head) //信息查询
{
system("cls");
int n;
printf("---------------------------------\n");
printf(" 请选择要查询的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
system("cls");
printf("请稍后...");
Sleep(500);
printf("\n");
switch (n)
{
case '1' : searchinfo(head);break;
case '2' : searchgrade(head);break;
}
}
void Delete(node head) //信息删除
{
system("cls");
int n, flag = 0;
node pre = head;
node cure = head->next;
char name[20];
do
{
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",name);
Sleep(500);
system("cls");
if (pre->next == NULL)
printf ("暂无数据!无法删除!");
else
{
while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
{
pre = cure;
cure = pre->next;
}
if (pre->next == NULL)
printf("查无此人!");
else
{
pre->next = cure->next;
flag = 1;
if (flag)
printf("删除成功!");
else
printf("删除失败!");
Sleep(500);
free (cure);//释放链表
}
}
system("cls");
printf("| 是否继续删除 |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
Sleep(500);
if(n == '2')break;
}while(1);
}
void Freelink(node head) //释放链表
{
node p = head->next;
while(p)
{
head->next = p->next;//头指针指向下一个结点
free(p);//释放结点
p = head->next;
}
}
void over(node head)
{
system("cls");
int n;
printf("| 您确定要退出吗? |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
while(1)
{
switch(n)
{
case'1':
{
system("cls");
system("cls");
printf("正在退出...");
Sleep(1000);
system("cls");
printf("退出成功!");
system("cls");
printf("谢谢使用!");
Freelink(head);
exit(0);
break;
}
case'2':
{
menu();
break;
}
}
}
}
node head = NULL; //==================//
void menu()
{
if(head == NULL) head = creatlist(); ; //=============//
do
{
system("cls");
int n;
printf("--------------------------------------\n");
printf("| 学生学籍信息管理系统 |\n");
printf("--------------------------------------\n");
printf(" 1:信息录入\n");
printf(" 2:信息查询\n");
printf(" 3:信息删除\n");
printf(" 4:退出程序\n");
printf("--------------------------------------\n");
n = getch();
Sleep(500);
switch(n)
{
case'1': //信息录入
{
creatnode(head);
}break;
case'2': //信息查询
{
search(head);
}break;
case'3': //信息删除
{
Delete(head);
}break;
case'4': //退出程序
over(head);break;
}
}while(1);
}
int main()
{
menu();
}
delete是关键词!
建议把所有delete改成del
还有就是我试了一下你的search,没问题呀
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define Len sizeof (struct NODE)
struct INFORMATION //基本信息
{
char number[15]; //学号
char name[20]; //姓名
char sex[10]; //性别
char dormitory[20]; //宿舍号码
char telephone[20]; //电话号码
};
struct GRADE //成绩信息
{
char number[15]; //学号
char name[20]; //姓名
char subnumber [10][10]; //课程编号
char subname [10][50]; //课程名称
float credit[10]; //学分
float usugrade[10]; //平时成绩
float testgrade[10]; //实验成绩
float scalgrade[10]; //卷面成绩
float ovalgrade[10]; //综合成绩
float finalcredit[10]; //实得学分
};
struct NODE
{
struct INFORMATION dataI; //数据域
struct GRADE dataG;
struct NODE * next; //指针域
};
typedef struct NODE Node;
typedef struct INFORMATION Info;
typedef struct GRADE Grade;
typedef Node *node;
node creatlist(); //建立表头
node creatnode(node head); //信息录入
void insertnode(node head, node newnode); //插入结点
void searchinfo (node head); //查找基本信息
void searchgrade(node head); //查找成绩信息
void search(node head); //信息查询
void Delete(node head); //信息删除
void Freelink(node head); //释放链表
void menu(node head); //菜单函数
node creatlist() //建立表头
{
node headnode = (node)malloc(Len);
headnode -> next = NULL;
return headnode;
}
node creatnode(node head) //信息录入
{
int n, choice;
float g;
do{
system("cls");
printf("---------------------------------\n");
printf(" 请选择要录入的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
printf("\n");
switch (n)
{
case '1' :
{
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataI.number);
printf("姓名:");
scanf("%s", newnode->dataI.name);
printf("性别:");
scanf("%s", newnode->dataI.sex);
printf("宿舍号码:");
scanf("%s", newnode->dataI.dormitory);
printf("电话号码:");
scanf("%s", newnode->dataI.telephone);
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}while (1);
}break;
case '2' :
{
int i = 0;
char choice;
do{
node newnode = (node)malloc(Len);
newnode->next = NULL;
system("cls");
printf("学号:");
scanf("%s", newnode->dataG.number);
printf("姓名:");
scanf("%s", newnode->dataG.name);
for (i = 0; ; i++)
{
printf("课程编号:");
scanf("%s", newnode->dataG.subnumber[i]);
printf("课程名称:");
scanf("%s", newnode->dataG.subname[i]);
printf("学分:");
scanf("%f", &newnode->dataG.credit[i]);
printf("平时成绩:");
scanf("%f", &newnode->dataG.usugrade[i]);
printf("实验成绩:");
scanf("%f", &newnode->dataG.testgrade[i]);
printf("卷面成绩:");
scanf("%f", &newnode->dataG.scalgrade[i]);
if (newnode->dataG.testgrade[i] < 0)
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.3 + newnode->dataG.scalgrade[i] * 0.7;
else
newnode->dataG.ovalgrade[i] = newnode->dataG.usugrade[i] * 0.15 + newnode->dataG.testgrade[i] * 0.15 + newnode->dataG.scalgrade[i] * 0.7;
g = newnode->dataG.ovalgrade[i];
if (g <= 100 && g >= 90)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i];
if (g < 90 && g >= 80)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.8;
if (g < 80 && g >= 70)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.75;
if (g < 70 && g >= 60)
newnode->dataG.finalcredit[i] = newnode->dataG.credit[i] * 0.6;
if (g < 60)
newnode->dataG.finalcredit[i] = 0.0;
printf("\n");
newnode->dataG.number[i+1] = '\0';
newnode->dataG.name[i+1] = '\0';
newnode->dataG.subnumber[i][10] = '\0';
newnode->dataG.subname[i][50] = '\0';
printf("----------------------------------\n");
printf(" 是否继续录入课程信息:\n");
printf(" 1:是\n");
printf(" 2:否\n");
printf("----------------------------------");
choice = getch();
printf("\n");
if (choice == '2')
break;
}
insertnode(head, newnode);
Sleep(500);
system("cls");
printf("录入成功!");
Sleep(500);
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
Sleep(500);
if (choice == '2')
break;
}while(1);
}break;
}
system("cls");
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回菜单\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
{
menu(head);
break;
}
}while(1);
return head;
}
void insertnode(node head, node newnode) //插入结点
{
newnode->next = head->next;
head->next = newnode;
}
void searchinfo (node head) //查找基本信息
{
system("cls");
int n, choice;
node p = head->next;
do{
printf("------------------------------\n");
printf(" 1:学号查找\n");
printf(" 2:姓名查找\n");
printf(" 3:宿舍查找\n");
printf("------------------------------");
n = getch();
printf("\n");
switch(n)
{
case'1':
{
char num[10];
while(1)
{
system("cls");
printf("请输入查找的学生学号:");
scanf("%s", num);
printf("\n");
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p == NULL || p->dataI.number[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.number,num) == 0)
{
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
break;
}
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}break;
case'2':
{
char name[20];
while(1)
{
system("cls");
printf("请输入查找的姓名:");
scanf("%s", name);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p == NULL || p->dataI.name[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.name,name) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
case'3':
{
char dorm[10];
while(1)
{
system("cls");
printf("请输入查找的宿舍号码:");
scanf("%s", dorm);
printf(" 学号 姓名 性别 宿舍号码 电话号码 \n");
if (p == NULL || p->dataI.dormitory[0] == '\0')
printf("暂无数据!\n");
else
{
while(p != NULL)
{
if (strcmp(p->dataI.dormitory,dorm) == 0)
printf("%10s %-20s %2s %10s %11s\n",p->dataI.number, p->dataI.name, p->dataI.sex, p->dataI.dormitory, p->dataI.telephone);
p = p->next;
}
}
printf("---------------------------------\n");
printf(" 是否继续录入信息:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("---------------------------------");
choice = getch();
if (choice == '2')
break;
}
}
}
}while(1);
}
void searchgrade(node head) //查找成绩信息
{
system("cls");
int i = 0, choice;
float sum = 0.0;
char num[10];
node p = head->next;
while(1)
{
printf("请输入查找的学生的学号:");
scanf("%s", num);
if (p == NULL)
{
Sleep(1000);
printf("暂无数据!");
}
while(p != NULL)
{
printf("学号:%10s 姓名:%-20s\n",p->dataG.number, p->dataG.name);
while(p->dataG.subnumber[i][0] != '\0' && p->dataG.subname[i][0] != '\0')
{
printf("课程编号:%-10s 课程名称:%-15s 综合成绩:%-5.1f 实得学分:%-5.1f\n", p->dataG.subnumber[i], p->dataG.subname[i], p->dataG.ovalgrade[i], p->dataG.finalcredit[i]);
sum += p->dataG.finalcredit[i];
i++;
}
printf("共修:%d 科 实得总学分为: %-5.1f\n", i, sum);
p = p->next;
}
system("cls");
printf("-----------------------------\n");
printf(" 是否继续查找:\n");
printf(" 1:是\n");
printf(" 2:返回上一级\n");
printf("-----------------------------");
choice = getch();
if (choice == '2')
{
search(head);
break;
}
}
}
void search(node head) //信息查询
{
system("cls");
int n;
printf("---------------------------------\n");
printf(" 请选择要查询的学生信息\n");
printf(" 1:基本信息\n");
printf(" 2:成绩基本信息\n");
printf("---------------------------------");
n = getch();
system("cls");
printf("请稍后...");
Sleep(500);
printf("\n");
switch (n)
{
case '1' : searchinfo(head);break;
case '2' : searchgrade(head);break;
}
}
void Delete(node head) //信息删除
{
system("cls");
int n, flag = 0;
node pre = head;
node cure = head->next;
char name[20];
do
{
system("cls");
printf("请输入要删除的学生姓名:");
scanf("%s",name);
Sleep(500);
system("cls");
if (pre->next == NULL)
printf ("暂无数据!无法删除!");
else
{
while (cure != NULL && strcmp(cure->dataI.name,name) != 0)
{
pre = cure;
cure = cure->next;
}
if (pre->next == NULL)
printf("查无此人!");
else
{
pre->next = cure->next;
flag = 1;
if (flag)
printf("删除成功!");
else
printf("删除失败!");
Sleep(500);
free (cure);//释放链表
}
}
system("cls");
printf("| 是否继续删除 |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
Sleep(500);
if(n == '2')break;
}while(1);
}
void Freelink(node head) //释放链表
{
node p = head->next;
while(p)
{
head->next = p->next;//头指针指向下一个结点
free(p);//释放结点
p = head->next;
}
}
void over(node head)
{
system("cls");
int n;
printf("| 您确定要退出吗? |\n");
printf(" 1:确定\n");
printf(" 2:取消\n");
n = getch();
while(1)
{
switch(n)
{
case'1':
{
system("cls");
system("cls");
printf("正在退出...");
Sleep(1000);
system("cls");
printf("退出成功!");
system("cls");
printf("谢谢使用!");
Freelink(head);
exit(0);
break;
}
case'2':
{
menu(head);
break;
}
}
}
}
void menu(node head)
{
do
{
system("cls");
int n;
printf("--------------------------------------\n");
printf("| 学生学籍信息管理系统 |\n");
printf("--------------------------------------\n");
printf(" 1:信息录入\n");
printf(" 2:信息查询\n");
printf(" 3:信息删除\n");
printf(" 4:退出程序\n");
printf("--------------------------------------\n");
n = getch();
Sleep(500);
switch(n)
{
case'1': //信息录入
{
creatnode(head);
}break;
case'2': //信息查询
{
search(head);
}break;
case'3': //信息删除
{
Delete(head);
}break;
case'4': //退出程序
over(head);break;
}
}while(1);
}
int main()
{
node head = creatlist();
menu(head);
}
部分功能无法运行?