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

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

作者: 始于尘埃 | 来源:发表于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