#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct addressBook{
char name[20];
int age;
char tel[20];
struct addressBook *next;
}adb,*adbk;
typedef struct addressBook1{
char name[20];
int age;
char tel[20];
}a1,*aa;
a1 a[100];
int n;
adbk createAddressBook(adbk &T){//正常创建链表
adbk p1,p2;
n=0;
T=NULL;
p1=p2=(adbk)malloc(sizeof(adb));
scanf("%s%d%s",&p1->name,&p1->age,&p1->tel);
while(p1->age!=0){
n++;
if(n==1)T=p1;
else p2->next=p1;
p2=p1;
p1=(adbk)malloc(sizeof(adb));
scanf("%s%d%s",&p1->name,&p1->age,&p1->tel);
}
p2->next=NULL;
return T;
}
adbk createAddressBook2(adbk &T){//倒序创建链表
adbk p;
n=0;
p=T=(adbk)malloc(sizeof(adb));
scanf("%s%d%s",&T->name,&T->age,&T->tel);
T->next=NULL;
while(p->age!=0){
n++;
if(n==1);
else p->next=T;
T=p;
p=(adbk)malloc(sizeof(adb));
scanf("%s%d%s",&p->name,&p->age,&p->tel);
}
return T;
}
void print(adbk &T){//输出创建的电话号码薄
printf("\n电话薄中的记录如下:\n");
adbk p=T;
if(p!=NULL)
do{
printf("%s,%d,%s\n",p->name,p->age,p->tel);
p=p->next;
}while(p!=NULL);
}
adbk del(adbk &T,char *name){//依据电话薄中的名字,删除该条记录
adbk p1,p2;
if(T==NULL){printf("\nlist is null\n");return T;}
p1=T;
while((strcmp(name,p1->name))!=0&&p1!=NULL){
p2=p1;
p1=p1->next;
}
if(strcmp(name,p1->name)==0){
if(p1==T){
T=p1->next;
}
else p2->next=p1->next;
n--;
printf("record(%s) is delete\n",name);
return T;
}
else{
printf("\nthis accord(%s) is not in the addressBook,please check\n",name);
return T;
}
}
adbk insert(adbk &T,int position){//依据记录中的位置插入记录,如插入在第1位置(本条记录在第一个位置)
adbk p1,p2,new_record;
new_record=(adbk)malloc(sizeof(adb));
printf("\n请插入记录\n");
scanf("%s%d%s",&new_record->name,&new_record->age,&new_record->tel);
p2=p1=T;
if(position==1){new_record->next=T;T=new_record;n++;return T;}
while((position--)>1){
p2=p1;
p1=p1->next;
}
p2->next=new_record;
new_record->next=p1;
n++;
return T;
}
adbk change(adbk &T,char *name){//根据名字,修改本记录的内容
adbk p;
p=T;
while(strcmp(name,p->name)!=0){
p=p->next;
}
printf("请输入新纪录的内容\n");
scanf("%s%d%s",&p->name,&p->age,&p->tel);
return T;
}
adbk readRecord(adbk &T){//从磁盘上读入电话薄的记录,基本程序和创建电话薄类似
FILE *fp;
int i=0;
n=0;
T=NULL;
if((fp=fopen("C:/addressBook","rb"))==NULL){
printf("磁盘上没有电话薄,请先创建电话薄\n");
return NULL;
}
while(!feof(fp)){
fread(&a[i],sizeof(a),1,fp);
i++;
}
adbk p1,p2;
p1=p2=(adbk)malloc(sizeof(adb));
strcpy(p1->name,a[0].name);
p1->age=a[0].age;
strcpy(p1->tel,a[0].tel);
i=i-3;
while(i>=0){
n++;i--;
if(n==1)T=p1;
else p2->next=p1;
p2=p1;
p1=(adbk)malloc(sizeof(adb));
fread(&a[n],sizeof(a),1,fp);
strcpy(p1->name,a[n].name);
p1->age=a[n].age;
strcpy(p1->tel,a[n].tel);
}
n++;
p2->next=p1;
p1->next=NULL;
fclose(fp);
return T;
}
adbk writeRecord(adbk &T){//把链表里的记录写入到硬盘的文件上
FILE *fp;
adbk p;
p=T;
int i=0;
if((fp=fopen("c:/addressBook.txt","w"))==NULL){
printf("创建失败\n");
return T;
}
while(p){
strcpy(a[i].name,p->name);
a[i].age=p->age;
strcpy(a[i].tel,p->tel);
fwrite(&a[i],sizeof(a),1,fp);
p=p->next;
}
fclose(fp);
return T;
}
int main(){
adbk addressBook;
int m=0;
while(m!=-1){
printf("-------------------------------------------------\n");
printf("输入相关数字进行如下操作:\n");
printf("1:创建一个电话号码薄\n");
printf("2:删除某一条记录\n");
printf("3:插入一条记录\n");
printf("4:把创建的电话薄写入到硬盘中\n");
printf("5:从硬盘中读取记录并输出到屏幕\n");
printf("6:输出记录\n");
printf("-1:结束整个操作\n");
printf("---------------------------------------------------\n");
scanf("%d",&m);
switch(m){
case 1:printf("请写入数据,中间用空格隔开,(输入0 0 0结束数据输入)\n");
addressBook=createAddressBook(addressBook);
break;
case 2:printf("请输入要删除的名字\n");
char name[20];
scanf("%s",name);
del(addressBook,name);
break;
case 3:printf("请输入要插入的位置1-%d\n",n);
int wz;
scanf("%d",&wz);
if(wz>n)break;
else{
insert(addressBook,wz);
break;
}
case 4:writeRecord(addressBook);
printf("保存成功\n");
break;
case 5:printf("电话薄中的记录如下:\n");
adbk ak;
readRecord(ak);
print(ak);
break;
case 6:print(addressBook);break;
}
}
return 0;
}
浙公网安备 33010602011771号