云中烛火

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

#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;
}


 

 

posted on 2013-04-27 10:43  云中烛火  阅读(205)  评论(0)    收藏  举报