#include "stdio.h"
#include"stdlib.h"
#include "conio.h"
struct sstudent
{
unsigned number;
char name[10];
char tele[12];
struct sstudent * link;
};
void main()
{
struct sstudent * createtable();
void appendtotable(struct sstudent * stu);
void inserttotable(struct sstudent * stu);
void querytable(struct sstudent * stu, unsigned number);
void sorttable(struct sstudent * stu);
void printtable(struct sstudent * stu);
void save(struct sstudent * stu);
void load(struct sstudent * stu);
void help();
void modi(struct sstudent *h);
void search(struct sstudent *h);
struct sstudent * student;
unsigned number;
char keyvalue;
student = createtable();
clrscr();
help();
printf("\n= ");
while((keyvalue = getche()) != 'q' && keyvalue != 'q' && keyvalue != 27)
{
puts("");
switch(keyvalue)
{
case 'l': case 'l':
printtable(student); break;
case 'd': case 'd':
printf("please input the number you want delete: ");
scanf("%d", &number);
querytable(student, number);
break;
case 'a': case 'a':
appendtotable(student); break;
case 'i': case 'i':
inserttotable(student); break;
case 's': case 's':
sorttable(student);
puts("sort complished! please use command l to list.");
break;
case 'f': case 'f':
search(student);
break;
case 'm': case 'm':
modi(student);
break;
case 'v': case 'v':
save(student); break;
case 'o': case 'o':
load(student); break;
case 'h': case 'h':
help(); break;
default: puts("error command!");
}
printf("\n= ");
}
}
struct sstudent * createtable()
{
struct sstudent * stu;
stu = (struct sstudent *) malloc(sizeof(struct sstudent));
stu->number = 0;
stu->name[0] = '\0';
stu->tele[0] = '\0';
stu->link = null;
return(stu);
}
void appendtotable(struct sstudent * stu)
{
struct sstudent * next, * last;
int number;
last = stu;
while(last->link) last = last->link;
printf("please input the number (0 to quit): ");
scanf("%d", &number);
while(number)
{
next = (struct sstudent *) malloc(sizeof(struct sstudent));
next->number = number;
printf("please input name: ");
scanf("%s", next->name);
printf("please input tele: ");
scanf("%s", next->tele);
last->link = next;
last = last->link;
printf("\nplease input the number (0 to quit): ");
scanf("%d", &number);
}
last->link = null;
}
void inserttotable(struct sstudent * stu)
{
struct sstudent * next, * last;
int number;
printf("please input the number (0 to quit): ");
scanf("%d", &number);
while(number)
{
next = (struct sstudent *) malloc(sizeof(struct sstudent));
next->number = number;
printf("please input name: ");
scanf("%s", next->name);
printf("please input tele: ");
scanf("%s", next->tele);
last = stu;
while(last->link)
{
if(last->link->number > next->number)
{
next->link = last->link;
last->link = next;
break;
}
else last = last->link;
}
printf("\nplease input the number (0 to quit): ");
scanf("%d", &number);
}
}
void querytable(struct sstudent * stu, unsigned number)
{
struct sstudent * temp, * next;
next = stu;
while(next->link)
{
if(next->link->number == number)
{
temp = next->link;
next->link = next->link->link;
free(temp);
}
else next = next->link;
}
}
void printtable(struct sstudent * stu)
{
stu = stu->link;
if(!stu)
{
puts("the table is empty!");
return;
}
printf("number\tname\ttele\n");
while(stu)
{
printf("%3d\t", stu->number);
printf("%-s\t", stu->name);
printf("%-s\t", stu->tele);
printf("\n");
stu = stu->link;
}
}
void sorttable(struct sstudent * stu)
{
struct sstudent * next, * last, * temp;
int flag;
last = stu;
while(last->link)
{
next = stu; flag = 1;
while(next->link != last->link)
{
if(next->link->number > last->link->number)
{
temp = last->link;
last->link = last->link->link;
temp->link = next->link;
next->link = temp;
flag = 0;
break;
}
else next = next->link;
}
if(flag) last = last->link;
}
}
void save(struct sstudent * stu)
{
char filename[13];
file * filesave;
printf("please input the filename you want save in: ");
scanf("%s", filename);
if((filesave = fopen(filename, "wb")) == 0)
{
printf("cannot open file %s !\n", filename);
return;
}
puts("saveing ...");
stu = stu->link;
while(stu)
{
fwrite(stu, sizeof(struct sstudent), 1, filesave);
stu = stu->link;
}
puts("saveing is finished!");
}
void load(struct sstudent * stu)
{char filename[13];
file * fileload;
struct sstudent * temp;
while(stu->link)
{
temp = stu->link;
stu->link = stu->link->link;
free(temp);
}
temp = (struct sstudent *) malloc(sizeof(struct sstudent));
printf("please input the filename you want load from: ");
scanf("%s", filename);
if((fileload = fopen(filename, "rb")) == 0)
{
printf("cannot open file %s !\n", filename);
return;
}
puts("loading ...");
while(fread(temp, sizeof(struct sstudent), 1, fileload))
{stu->link = temp;
stu = stu->link;
temp = (struct sstudent *) malloc(sizeof(struct sstudent));
}
stu->link = null;
puts("loading is finished!");
}
void help()
{ puts(" *********************************************");
puts(" * system command help *");
puts(" *********************************************");
puts(" * l = list all records *");
puts(" * d = delete a record seleced by number *");
puts(" * a = append records *");
puts(" * i = insert records *");
puts(" * s = sort records *");
puts(" * f= search records *");
puts(" * m= modi records *");
puts(" * h = show this help message *");
puts(" * v = save records to a file *");
puts(" * o = load records from a file *");
puts(" * q = quit system *");
puts(" *********************************************");
}
void modi(struct sstudent *h)
{
struct sstudent *p; /* 移动指针*/
unsigned num; /*存放学号的变量*/
clrscr(); /*清屏幕*/
printf("please enter number for modifi\n");
scanf("%d",&number); /*输入学号*/
p=h; /*将头指针赋给p*/
while(s (p->number!=num)&&p!=null) /*当记录的姓名不是要找的,且指针不为空时*/
p=p->link; /*移动指针,指向下一结点*/
if(p==null) /*如果指针为空*/
printf("\nlist no %d student\n",num); /*显示没有该学生*/
else /*修改找到的记录信息*/
{
printf("please input new name: ");
scanf("%s", next->name);
printf("please input new tele: ");
scanf("%s", next->tele);
printf("|number | name | tel | \n");
printf("|----------|---------------|---------------|\n");
printf("|%6d|%-10s|%12s|\n", p->number,p->name,p->tele);
}
}
void search(struct sstudent *h)
{
struct sstudent *p; /* 移动指针*/
char s[10]; /*存放姓名的字符数组*/
clrscr(); /*清屏幕*/
printf("please enter name for search\n");
scanf("%s",s); /*输入姓名*/
p=h; /*将头指针赋给p*/
while(strcmp(p->name,s)&&p!=null) /*当记录的姓名不是要找的,且指针不为空时*/
p=p->link; /*移动指针,指向下一结点*/
if(p==null) /*如果指针为空*/
printf("\nlist no %s student\n",s); /*显示没有该学生*/
else /*显示找到的记录信息*/
{
printf("\n\n***********************havefound***********************\n");
printf("|number | name | tel | \n");
printf("|----------|---------------|---------------|\n");
printf("|%10d|%-10s|%12s|\n", p->number,p->name,p->tele);
printf("****************************end***************************\n");
}
}