第一步输入完数据后 然后退出进行第五步输出数据时 学号输出的时候还附带了姓名(就是本来应该只输出学号却还多输出了名字) 不知道为什么?
源代码如下
#include
#include
#include
#include
int bExit = 0;
int total = 0;
#define Create(the_one) the_one=(Stu *)malloc(sizeof(Stu))
typedef
struct Student
{
char num[12]; // 数字学号
char name[20]; // 姓名
char sex[5]; // 性别
char telnum[11]; // 电话号码
struct Student *next;
}Stu;
Stu *the_one, *h, *pr,*last, *end;
//1.添加学生函数
void ADD()
{
int Four = 0;
printf("================================\n");
Create(the_one);
the_one->next = NULL;
end = last; //end指向倒数第二个结点
last->next = the_one;//将the_one放在链表的 最后
last = the_one; //last指向倒数第一个结点
//输入学号
printf("输入学生信息:\n12位学号:");
while (!Four)
{
gets(the_one->num);
if (strlen(the_one->num) != 12)
printf("输入非法:学号必须是12位,请重新输入!\n学号:");
else
Four = 1;
}
//输入姓名
printf("学生姓名:");
gets(the_one->name);
//输入电话号码
printf("学生电话号码(11位):");
gets(the_one->telnum);
//请输入性别
printf("请输入性别(填写男或女): ");
gets(the_one->sex);
//总数+1
total++;
printf("================================\n");
}
//2.查询学生函数
void CHECK()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要查找学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
free(target);
fond = 1;
}
}
if (!fond)
printf("Wrong Student NO.!\n");
printf("================================\n");
}
//3.编辑学生
void EDIT()
{
Stu *target, *p;
int fond = 0;
printf("================================\n");
printf("输入要编辑学生的学号:\n学号:");
Create(target);
gets(target->num);
for (p = h->next; p; p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
printf("请选择修改项目:\n1:姓名\n2:电话号码\n");
char c;
c = getch();
switch (c)
{
case '1':
printf("输入正确的姓名:");
gets(p->name);
break;
case '2':
printf("输入最新电话号码:");
gets(p->telnum);
break;
}
printf("学号为%s的学生最新信息:姓名(%s),性别(%s),电话号码(%s)\n", p->num, p->name,p->sex, p->telnum);
free(target); // ??
fond = 1;
}
}
if (!fond)
printf("Not Exit This NO.!\n");
printf("================================\n");
}
//4.删除学生
void DELETE1()
{
void PRINALL();
PRINALL();
Stu *target, *p, *pr;
int fond = 0;
printf("================================\n");
printf("输入要删除学生的学号:(如果删除所有学生信息,请输入0000)\n学号:");
Create(target);
gets(target->num);
// char *zero=&"0000";
if (!strcmp(target->num, "0000"))
{
h->next = NULL;
total = 0;
}
else
{
for (pr = h, p = h->next; p; pr = pr->next, p = p->next)
{
if (!strcmp(p->num, target->num))
{
printf("学号为%s的学生信息已删除\n", p->num);
free(target);
pr->next = p->next;
p->next = NULL;
// free(p);此句报错
fond = 1;
total--;
}
}
if (!fond)
printf("没有找到学号为%s的学生,请确认学号输入是否正确\n");
}
printf("================================\n");
}
//5.打印全部
void PRINALL()
{
int amounts = 1;
Stu *ap;
printf("================================\n");
printf("所有学生信息:\n");
for (ap = h->next; ap; ap = ap->next)
printf("%d,%s,%s,%s,%s\n",amounts++,ap->name,ap->num,ap->sex,ap->telnum);
printf("================================\n");
}
//6.总人数
void TOTAL()
{
printf("================================\n");
printf("学生总人数:%d\n", total);
printf("================================\n");
}
//菜单函数
void Menu()
{
char order;
printf("================================\n");
printf("| 1.添加学生. |\n");
printf("| 2.查询学生. |\n");
printf("| 3.编辑学生. |\n");
printf("| 4.删除学生. |\n");
printf("| 5.打印全部. |\n");
printf("| 6.总人数. |\n");
printf("| 7.退出. |\n");
printf("================================\n");
order = getch();
system("cls");
switch (order)
{
case '1':
ADD();
break;
case '2':
CHECK();
break;
case '3':
EDIT();
break;
case '4':
DELETE1();
break;
case '5':
PRINALL();
break;
case '6':
TOTAL();
break;
case '7':
bExit = 1;
break;
}
while (!bExit)
{
getch();
system("cls");
Menu();
}
}
void main()
{
//创建链表头
Create(h);
pr = last = end = the_one = h;
the_one->next = NULL;
Menu();
}