数据结构(基于链表的通信录管理系统)

意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度

模块:

一级菜单内容

1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件

2> 登录模块:使用输入的登录账号和密码与文件存储信息对比

3> 退出系统

二级菜单内容:

3> 创建模块create:创建链表完成对通信录的存储

4> 添加数据add:添加通信录的信息放入链表中

5> 查找信息find:可以通过姓名进行查找

6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;

7> 删除信息delete:可根据输入的姓名进行删除

8> 插入信息insert:将给定的信息以及插入位置信息完成插入

9> 展示信息show:将通讯录的所有信息进行展示

10> 导出信息export:将通讯录信息导出到文件中

11> 按照姓名将通讯录排序

12> 返回上一级

test.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"test.h"

    int menu1;      //功能菜单选项
    char userName[20];
    char pwd[20];
//主界面菜单
void interface(){
    while(1)
    {
    printf("\t\t=====员工登录系统=======\n");
        printf("\t\t1、注册信息\n");
        printf("\t\t2、用户登录\n");
        printf("\t\t0、退出\n");
        printf("\t\t*************************\n");
        printf("请输入功能选项:");
        scanf("%d", &menu1);
    
    switch(menu1)
        {
        case 1:{
                regist();
               }
                break;
               
        case 2:
                {
                sign(); 
                }break;
        case 0:
            break;
    return ;
    }
}
}
//注册信息函数
void regist(){
                for(;;)
                {
                printf("请输入注册账号:");
                scanf("%s", userName);
                printf("请输入注册密码:");
                scanf("%s", pwd);

                    if(strlen(pwd)<6)
                    {
                        printf("您输入的密码不合法,请重新输入\n");
                    }else
                    {
                        printf("注册成功\n");
                        break;
                    }
                }

                //将新用户的账号和密码保存到文件中区
                FILE *fp = fopen(".//account.txt", "a+");
                if(NULL==fp)
                {
                    printf("文件打开失败\n");
                    return ;

                }

                //将信息报错到文件中

                fprintf(fp, "%s %s\n", userName, pwd);

                //关闭文件
                fclose(fp);
            }
//自定义函数
void sign(){

                    char name[20];
                    char password[20];

                    printf("请输入登录账号:");
                    scanf("%s", name);
                    printf("请输入密码:");
                    scanf("%s", password);

                    //获取数据库中的账号和密码
                    FILE *fp = fopen(".//account.txt", "r");
                    if(NULL == fp)
                    {
                        printf("文件打开失败\n");
                        return ;
                    }

                    while(!feof(fp))
                    {
                    //读取信息
                        fscanf(fp, "%s%s", userName, pwd);
                        if(strcmp(userName,name)==0 && strcmp(pwd,password)==0)
                        {
                            printf("登录成功\n");
                            printf("请选择以下功能\n");
                            Linklist L=list_create();
                            Linklist apply_node();
                
                            while(1)
                            {
                            face2();
                            int flag=0;
                            switch(menu1){
                                case 1:{
                                    list_inset_add(L);
                                       }break;
                                case 2:{
                                    scanf("%s",name);
                                    list_find(L,name);
                                       }break;
                                    
                                case 3:{
                                    scanf("%s",name);
                                    list_update(L,name);
                            }break;
                                case 4:{
                                       scanf("%s",name);
                                       list_delete_pos(L,name);
                                       }break;
                                      
                                case 5:{
                                    insert_pos(L);
                                       }break;

                                case 6:{
                                    list_show(L);
                                       }break;

                                case 7:
                                    {
                                    list_derive(L);
                                    }break;

                                case 8:{
                                    list_sort_name(L);
                                       }break;

                                case 9:{
                                           flag=1;
                                       }break;

                                                                    
                        }

                            if(flag==1){
                            break;
                            }

                        }
                    }


                }

                    printf("登录失败\n");
                    fclose(fp);
}

//二级菜单
void face2(){
    printf("\t\t***************************\n");    
        printf("\t\t1、****添加数据****\n");
        printf("\t\t2、****查找信息****\n");
        printf("\t\t3、****修改信息****\n");
        printf("\t\t4、****删除信息****\n");
        printf("\t\t5、****插入信息****\n");
        printf("\t\t6、****展示信息****\n");
        printf("\t\t7、****导出信息****\n");
        printf("\t\t8、****按照姓名排序\n");
        printf("\t\t9、****返回上一级****\n");
    printf("\t\t*************************\n");
        printf("请输入功能选项:");
        scanf("%d", &menu1);
}

//创建链表
Linklist list_create(){
    //在堆区申请头结点
    Linklist L=(Linklist)malloc(sizeof(Node));
    if(NULL==L){
        printf("创建失败\n");
        return NULL;
    }
    //初始化
    L->len=0;
    L->next=NULL;
    printf("创建成功\n");
    return L;
}
//申请结点封装数据
Linklist apply_node(){
    //申请结点空间
    Linklist p=(Linklist)malloc(sizeof(Node));
    if(NULL==p){
        printf("结点申请失败\n");
        return NULL;
    }
    p->next=NULL;
    return p;
}
//遍历
void list_show(Linklist L){
    if(NULL==L){
        printf("遍历失败\n");
        return ;
    }
    //定义遍历指针
    Linklist q=L->next;
    while(q!=NULL){
        printf("编号%d\n",q->data.no);    
        printf("姓名%s\n",q->data.name);
        printf("性别%s\n",q->data.sex);
        printf("电话%s\n",q->data.tel);
        q=q->next;
    }
    printf("\n");
}

//添加信息
int list_inset_add(Linklist L){
    Linklist p=apply_node();
    if(NULL==p){
        printf("添加失败\n");
        return -1;
    }
    p->next=L->next;
    L->next=p;
    printf("请输入编号");
    scanf("%d",&p->data.no);
    printf("请输入姓名");
    scanf("%s",p->data.name);
    printf("请输入性别");
    scanf("%s",p->data.sex);
    printf("电话号码:");
    scanf("%s",p->data.tel);
    printf("%s的信息录入成功",p->data.name);
    L->len++;
    return 0;

}

//查找
Linklist list_find(Linklist L,datatype name[]){
    if(NULL==L){
        printf("查找失败\n");
        return NULL;
    }
        Linklist q=L->next;
        for(int i=0;i<L->len;i++){
        printf("%s",q->data.name);
            if(strcmp(q->data.name,name)==0){
                printf("请输入要查找的姓名:\n");
                printf("%s",q->data.name);
                printf("查找成功\n");
                return q;
            }
            q=q->next;
    }
                    return NULL;

}

//修改信息
int list_update(Linklist L,datatype name[]){
    if(NULL==L){
    printf("修改失败\n");
    return -1;
    }
    Linklist p=list_find(L,name);
    printf("请输入要修改的编号");
    scanf("%d",&p->data.no);
    printf("要修改的联系人的姓名:");
    scanf("%s",p->data.name);    
    printf("要修改的联系人的性别:");
    scanf("%s",p->data.sex);
    printf("要修改的联系人的电话:");
    scanf("%s",p->data.tel);
    list_show(L);
    printf("修改成功\n");
    return 0;
}
//删除信息
int list_delete_pos(Linklist L,datatype name[]){
    if(NULL==L){
        printf("删除失败\n");
        return -1;
    }
        int i,temp;
        Linklist p=L->next;
        for(i=0;i<L->len;i++){
            if(strcmp(p->data.name,name)==0){
                temp=i;
                p=p->next;
            }
        }
        Linklist t=L;
        for(i=0;i<temp;i++){
            t=t->next;    
        }
        Linklist q=t->next;
        t->next=q->next;
        free(q);
        q=NULL;
        L->len--;
        printf("删除成功\n");
        return 0;
}

//插入信息
int insert_pos(Linklist L){
    if(NULL==L){
        printf("插入失败\n");
        return -1;
    }
    Linklist p=apply_node();
    p->next=L->next;
    L->next=p;
    p=list_inset_add(L);
    L->len++;
    printf("插入成功\n");
    return 0;
}
//导出信息
void list_derive(Linklist L){
    if(NULL==L){
        printf("遍历失败\n");
        return ;
    }
    //定义遍历指针
    Linklist q=L->next;
    int i;
    for(i=0;i<L->len;i++){
        printf("编号%d\n",q->data.no);    
        printf("姓名%s\n",q->data.name);
        printf("性别%s\n",q->data.sex);
        printf("电话%s\n",q->data.tel);
        //导出信息到文件
            FILE *fp = fopen(".//meum.txt", "a+");
            if(NULL==fp)
                {
                    printf("文件打开失败\n");
                    return ;

                }

                //将信息保存到文件中

                fprintf(fp, "%d %s %s %s\n",q->data.no,q->data.name,q->data.sex,q->data.tel);

                //关闭文件
                fclose(fp);
            }
        q=q->next;
    }
//按照姓名在通讯录排序
void list_sort_name(Linklist L){
    if(NULL==L){
        printf("排序失败\n");
        return ;
    }
    Linklist p = L->next;
    staff temp;
    for(int i=1;i<L->len;i++){
    Linklist p=L->next;
        for(int j=0;j<L->len-i;j++){
            if(strcmp(p->data.name,p->next->data.name)>0){
                    temp=p->data;
                    p->data=p->next->data;
                    p->next->data=temp;    
            }
            p=p->next;
        }

    }

}



test.h

#ifndef __TEST_H__
#define __TEST_H__
typedef char datatype;

//定义联系人结构体
typedef struct staff{
    int no; // 编号
    char name[20];//姓名
    char sex[66];     //性别
    char tel[15];  //电话
}staff;
//定义结点结构体
typedef struct Node{
        staff data;  //普通数据域
        int len;      //头结点数据域
    struct Node *next; //头结点指针域
}*Linklist,Node;
//注册信息
void regist();
void interface();
int list_update();
//登陆
void sign();
//查找
Linklist list_find(Linklist L,datatype name[]);
//二级目录菜单
void face2();
//修改信息
int list_update(Linklist L,datatype name[]);
//创建链表
Linklist list_create();
//申请结点封装数据
Linklist apply_node();
//遍历
void list_show(Linklist L);
//添加数据
int list_inset_add(Linklist L);
//删除数据
int list_delete_pos(Linklist,datatype name[]);
//插入信息
int insert_pos(Linklist L);
//导出信息
void list_derive(Linklist L);
//排序
void list_sort_name(Linklist L);
#endif

main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"test.h"
int main(int argc, const char *argv[])
{
    int menu1;      //功能菜单选项
    char userName[20];
    char pwd[20];
    //调用主界面菜单函数
     interface();
    
    
            return 0;
}

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值