第1个回答 2009-11-05
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#include <mem.h>
#include <dos.h>
void pause();
typedef struct STUDENT
{
char name[20]; //姓名
char number[20]; //号码
char addr [20]; //地址
struct STUDENT *next; //指向下个数据
struct STUDENT *last; //指向上个
}STUDENT;
static STUDENT *first=NULL; //链表头
static STUDENT *end=NULL;
STUDENT *Malloc(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
memset(p->name,'\0',20);
memset(p->number,'\0',20);
memset(p->addr,'\0',20);
p->next=NULL;
p->last=NULL;
return p;
}
void Insert(STUDENT *t) //链表插入
{
STUDENT *p;
if (first==NULL)
first=t;
else
{ p=first;
while (p->next)
p=p->next;
p->next=t;
t->last=p;
end=t;
}
}
void loaddatabase() //加载数据
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("打开文件出错\n");
pause();
return;
}
p=Malloc();
//first=p;
while(fscanf(fp,"%s%s%s",
p->name,p->number,p->addr)>0)
{
Insert(p);
p=Malloc();
}
fclose(fp);
printf("\t\t 欢迎使用通讯录管理系统 \n\n");
printf("\n\n\n\n\n\n\n\t\t\t\t数据加载成功\n\n\n\n\n\n\n\t\t\t\t");
system("pause");
system("cls");
}
void savedata() //保存数据
{
FILE *fp;
STUDENT *p;
if (first==NULL )
{
printf("没有记录\n");
pause();
//return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("打开文件出错\n");
pause();
return;
}
p=first;
while(p)
{
fprintf(fp,"%s %s %s\n",p->name,p->number,p->addr);
p=p->next;
}
fclose(fp);
printf("数据保存成功\n");
}
void add() //添加记录
{
STUDENT *p;
STUDENT *newstudent=Malloc();
printf("请输入姓名:");
scanf("%s",newstudent->name);
printf("请输入号码:");
scanf("%s",newstudent->number);
printf("请输入地址:");
scanf("%s",newstudent->addr);
Insert(newstudent);
}
void pause()
{
system("pause");
system("cls");
}
void printall() //打印全部记录
{
STUDENT *p;
p=first;
printf("\n");
printf("姓名\t\t号码\t地址\n");
while (p)
{
printf("%s\t%s\t\t%s\n",p->name,p->number,p->addr);
p=p->next;
}
printf("\n");
}
void findbyname() //按姓名查询
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->name,buf)==0)
{ printf("%s\t %s\t %s\n",
p->name,p->number,p->addr);
i++;
break;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改记录\n");
}
void findbynumber() //按号码查询
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入号码:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->number,buf)==0)
{ printf("%s\t %s\t %s\n",
p->name,p->number,p->addr);
i++;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改记录\n");
}
void findbyaddr() //按地址查询
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入地址:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->addr,buf)==0)
{ printf("%s\t %s\t %s\n",
p->name,p->number,p->addr);
i++;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改记录\n");
}
int collect(){ //统计人数
int totalnum=0;
STUDENT *p;
p=first;
while (p)
{
totalnum++;
p=p->next;
}
printf("人数:%d \n",totalnum);
}
int delbyname() //通过姓名删除
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("请输入需删除人员的姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->name,buf)==0)
{
i++;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
if (first) first->last=NULL;
free(pbuf);
printf("删除成功\n");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("删除成功\n");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,没找到该记录\n");
}
int delbynumber() //通过号码删除
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("请输入需删除人员的号码:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->number,buf)==0)
{
i++;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
//first->last=NULL;
if (first) first->last=NULL;
free(pbuf);
printf("删除成功\n");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("删除成功\n");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,没找到该记录\n");
}
void changebynumber() //通过号码修改
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入需修改人员的号码:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->number,buf)==0)
{
printf("请输入姓名:");
scanf("%s",p->name);
printf("请输入号码:");
scanf("%s",p->number);
printf("请输入地址:");
scanf("%f",p->addr);
printf("修改成功");
i++;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改记录\n");
}
void changebyname() //通过姓名修改
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入需修改人员的姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->name,buf)==0)
{
printf("请输入姓名:");
scanf("%s",p->name);
printf("请输入号码:");
scanf("%s",p->number);
printf("请输入地址:");
scanf("%s",p->addr);
printf("修改成功\n");
i++;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改记录\n");
}
void exit_free()
{
STUDENT *p,*p1;
p=first;
while (p)
{
p1=p;
free(p1);
p=p->next;
}
}
void ver()
{
system("cls");
printf("\n");
printf("\t\t\t 通讯录管理 v1.0");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t作者 风中的纸屑\n\n\n");
}
int menu(void)
{
int choose;
//system("cls");
printf(" \n\n");
printf(" 1: 显示所有人员的信息 |");
printf(" 2: 按姓名查询 |\n");
printf(" 3: 按号码查询 |");
printf("\t 4: 按地址查询 |\n");
printf(" 5: 通过姓名删除 | ");
printf(" 6:按号码删除 |\n");
printf(" 7: 按号码修改信息 |");
printf(" 8: 按姓名修改信息 |\n");
printf(" 9: 添加 |");
printf(" \t\t 10:统计 |\n");
printf(" 11:保存所有信息 |");
printf(" 12:清屏 |\n");
printf(" 13: 版本 |");
printf("\t\t 14: 退出 |\n");
printf("\t \n");
printf(" ");
printf("\t 请输入对应数字:");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
system("cls");
printall();
printf("\n");
collect();
break;
case 2:
findbyname();
break;
case 3:
findbynumber();/*根据用户输入的学号显示该学生的信息*/
break;
case 4:
findbyaddr();
break;
case 5:
printall();
delbyname();
break;
case 6:
printall();
delbynumber();
break;
case 7:
printall();
changebynumber();/*根据用户输入的学号修改学生成绩*/
break;
case 8:
printall();
changebyname();/*保存数据*/
break;
case 9:
add();
break;
case 10:
collect();
break;
case 11:
savedata();
break;
case 12:
system("cls");
break;
case 13:
system("cls");
ver();
break;
case 14:
exit_free();
exit(1);
default: system("cls"); break;
}
}
int main()
{
loaddatabase();
while (1)
menu();
}
这是以前写的学生成绩管理改的,打印排版有点简单,你可以修改一下,不然输入的数据长度不同,可能无法对齐,DEV或者CodeBlocks下通过本回答被提问者采纳