美文网首页
数据结构的引用-用链表实现电话查询功能

数据结构的引用-用链表实现电话查询功能

作者: 始于尘埃 | 来源:发表于2019-07-29 18:16 被阅读0次

    ->数据结构的引用-用链表实现电话查询功能

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Phone_Number.h"
    
    //用户输入系统
    int get_num(){
        int n;
        //制作用户登录界面
        printf("\t\t\t                 ***************************\n");
        printf("\t\t\t                        ************\n");
        printf("\t\t\t         欢迎使用数理学院电话查询系统,请根据下列提示进行选择\n");
    
        printf("\t\t\t                    <--    1 创建    -->\n");
        printf("\t\t\t                    <--    2 查询    -->\n");
        printf("\t\t\t                    <--    3 插入    -->\n");
        printf("\t\t\t                    <--    4 修改   -->\n");
        printf("\t\t\t                    <--    5 删除   -->\n");
        printf("\t\t\t                    <--    0 退出    -->\n");
        printf("\t\t\t              <--    亲爱的用户,您的选择是    -->\n");
    
        for(; ; ){
            scanf("%d",&n); //获得用户输入
            if(n<0 || n>6){ //异常处理
                printf("您的输入有错,请您重新输入\n");
                return 0;
            }
            if(n>=0&&n<6) 
                break; //退出循环
        }
            
        return n;  //返回用户请求
    }
        
    int main(){   
        Linklist l;
        InitList(l);
        
        //用户查询系统
        for(; ;){    //无线循环,接收用户输入的信息(除非用户输入0)
            switch(get_num()){    //获取用户输入
            case 1:
                system("cls"); 
                printf("\t\t\t创建\n\n");
                printf("请按照下列格式输入\n姓名            固定电话           移动电话             邮件\n");
                printf("\n");
                CreatList(l);
                //PrintList(l);
                break;
            case 2:
                system("cls"); 
                int n;
                printf("如果查看通讯录,请按1,如果查找联系人,请按2\n");
                scanf("%d",&n);
                if(n ==1){
                    readFile(l);
                }
                if(n ==2){
                    Find_Name(l);
                }
                if(n>2)
                    printf("查询失败");
                
                
                break;
    
            case 3:
                system("cls"); 
                printf("\t\t\t插入\n\n");
                ListInsert(l);
                //PrintList(l);
                //readFile(l);
                break;
            case 4:
                system("cls"); 
                printf("\t\t\t修改\n\n");
                ChangeList(l);
                break;
            case 5:
                system("cls"); 
                printf("\t\t\t删除\n\n");
                ListDelete_LName(l);
                break;
            case 0:
                system("cls"); 
                printf("\t\t\t         感谢您使用数理学院电话查询系统,欢迎下次光临\n\n");
                system("pause");
                return 0;
            
            }
        };
        return 0;
        
    }
    
    
    
    4.2功能函数
    //定义链表节点,并封装相应操作
    
    //用户的节点由数据域和指针域构成
    typedef struct{
        char name[15]; 
        char phoneNumber[15]; 
        char mobileNumber[15]; 
        char mail[20];
    }DataType; 
    
     //两边存储结构
    typedef struct node{
        DataType data;
        struct node *next;
    }Lnode,*Linklist;
    
    //初始化链表(含头结点)
    
    void InitList(Linklist &L){
        L  = (Lnode*)malloc(sizeof(Lnode));
        L->next = NULL;
    }
    
    //保存用户数据
    void SaveFile(Linklist &L){
        FILE *fp;
        Lnode *p;
        p = L;
        if((fp = fopen("Phone_num.txt","wt")) == NULL){
            printf("文件结束");
            exit(0); //退出
        }
        if(p->next == NULL){
            printf("保存失败,请确保您的通讯录不为空");
        }
        else
        {
            p = p->next;
            while(p != NULL){    //遍历链表,读入数据
                //数据读入文件
                fprintf(fp,"%s                   %s\t                  %s                 %s",p->data.name,p->data.phoneNumber,p->data.mobileNumber,p->data.mail);
                fprintf(fp,"\n");
                p = p->next;
            }
            fclose(fp);
            printf("您的联系人已保存\n");
        }
    }
    
    //读取通信录全部信息
    
    void readFile(Linklist &L)          //读取文件信息  
    {      
        FILE *fp;    
        fp = fopen("Phone_num.txt","r");
        char ch;
        while((ch = fgetc(fp))!=EOF){
            putchar(ch);
        }
        fclose(fp);
    }  
    
    //按姓名查找联系人
    void Find_Name(Linklist &L) //按姓名查询      
    {      
        Linklist q,p;      
        q=L->next;  
    
        printf("输入要查询的姓名:\n");      
        p=(Lnode*)malloc(sizeof(Lnode));      
        scanf("%s",&p->data.name);      
        while(q!=NULL&& strcmp(q->data.name,p->data.name)!=0)      
        {      
            q=q->next;      
        }      
        if(q==NULL)      
        {      
            printf("对不起,查无此人!\n");      
        }      
        else      
        {   
            printf("已经找到此联系人!\n");    
            printf("-------------------------------------------------------------------------------\n");
            printf("    姓名        固定电话             移动电话             邮箱         \n");
            printf("-------------------------------------------------------------------------------\n");         
            printf("%s                      %s                          %s               %s",q->data.name,q->data.phoneNumber,q->data.mobileNumber,q->data.mail);       
        }      
    }      
     //在单链线性表L的第i个元素之前插入元素  
    bool ListInsert(Linklist &L)  
     {  
        Linklist s,p=L;  
        int  j = 1,i;  
        printf("输入要插入的位置:");      
        scanf("%d",&i);  
        while (p&&j < i)   
        {  // 寻找第i个结点  
           p = p->next;  
           ++j;  
        }   
        if (!p || j > i) {
            printf("----插入失败-----\n");
            return false;
        }      // i小于1或者大于表长  
        s = (Linklist)malloc(sizeof(Lnode));  // 生成新结点  
        printf("插入的联系人信息为:\n");  
        printf("-------------------------------------------------------------------------------\n");
        printf("    姓名        固定电话             移动电话             邮箱         \n");
        printf("-------------------------------------------------------------------------------\n");       
        scanf("%s%s%s%s",&p->data.name,&p->data.phoneNumber,&p->data.mobileNumber,&p->data.mail);     
        s->next = p->next;      // 插入L中  
        p->next = s; 
        SaveFile(L);
        printf("插入成功\n");
        return true;  
    }
    
    int Fund_LName(Linklist &L)  //寻找该姓名的位置  
     {  
        Linklist s,p=L->next;  
        int  i=0;  
        s=(Lnode*)malloc(sizeof(Lnode)); 
        printf("请输入您要寻找用户的名字\n");
        scanf("%s",s->data.name);  
        while(p!=NULL&&strcmp(p->data.name,s->data.name)!=0)  
        {  
            p=p->next;  
            ++i;  
        }  
        return i+1;  
    }  
    
    
    bool ListDelete_LName(Linklist &L)   //删除姓名为“XXX”的学生记录  
    {  
        Linklist p=L,q;  
        printf("输入要删除的学生的姓名:\n");  
        int  j = 0,i=Fund_LName(L);       
        while (p->next && j < i-1)   
        {  // 寻找第i个结点,并令p指向其前趋  
          p = p->next;    ++j;  
        }  
        if (!(p->next) || j > i-1) {printf("----查无此人删除失败-----\n");return false;}  // 删除位置不合理  
        q = p->next;      
        p->next = q->next;           // 删除并释放结点    
        free(q);  
        printf("----删除成功-----\n");  
        SaveFile(L);
        return true;  
    }  
    
    bool  CreatList(Linklist &L)     //采用尾插法在尾部插入元素  
    {  
        Linklist r, s;  
        r=L;   //r指针始终动态指向链表的当前表尾  
        while(r->next)  
        {//尾插法,直接把指针移位到尾部    
            r=r->next;   
        }  
        s=(Lnode*)malloc(sizeof(Lnode));   
        //printf("在尾部插入的联系人信息为:\n");  
        printf("-------------------------------------------------------------------------------\n");
        printf("    姓名        固定电话             移动电话             邮箱         \n");
        printf("-------------------------------------------------------------------------------\n"); 
        scanf("%s%s%s%s",&s->data.name,&s->data.phoneNumber,&s->data.mobileNumber,&s->data.mail);  
        s->next=NULL;  
        r->next=s;  
        SaveFile(L);
        return true;  
    }  
    
    //输出链表数据
    void PrintList(Linklist &L){
        Lnode *p;
        p = L->next;
        while(p != NULL){
            printf("%s                      %s                          %s               %s",p->data.name,p->data.phoneNumber,p->data.mobileNumber,p->data.mail);
            p  = p->next;
        }
        printf("\n");
    }
    
    //修改
    bool ChangeList(Linklist &L){
        //printf("请输入你要修改的用户的名字\n");
        int i = Fund_LName(L);
    
        //1.删除该节点
        Linklist p=L,q;  
        //printf("输入要删除的学生的姓名:");  
        int  j = 0;//i=Fund_LName(L);       
        while (p->next && j < i-1)   
        {  // 寻找第i个结点,并令p指向其前趋  
          p = p->next;    ++j;  
        }  
        if (!(p->next) || j > i-1) {printf("----查无此人删除失败-----\n");return false;}  // 删除位置不合理  
        q = p->next;      
        p->next = q->next;           // 删除并释放结点    
        free(q);  
        //printf("----删除成功-----\n");  
        SaveFile(L);
    
        //2.在第i个位置重新插入
    
        Linklist s,r=L;  
        int  k = 1;  
        //printf("输入要插入的位置:");      
        //scanf("%d",&i);  
        while (r&&k < i)   
        {  // 寻找第i个结点  
           r = r->next;  
           ++k;  
        }   
        if (!r || k > i) {
            printf("修改失败\n");
            return false;
        }      // i小于1或者大于表长  
        s = (Linklist)malloc(sizeof(Lnode));  // 生成新结点  
        printf("修改的联系人信息为:\n");  
        printf("-------------------------------------------------------------------------------\n");
        printf("    姓名        固定电话             移动电话             邮箱         \n");
        printf("-------------------------------------------------------------------------------\n");    
        scanf("%s%s%s%s",&s->data.name,&s->data.phoneNumber,&s->data.mobileNumber,&s->data.mail);     
        s->next = p->next;      // 插入L中  
        p->next = s; 
        SaveFile(L);
    
    }
    
    
    
    
    

    相关文章

      网友评论

          本文标题:数据结构的引用-用链表实现电话查询功能

          本文链接:https://www.haomeiwen.com/subject/qgdirctx.html