数据结构课程设计之通讯录管理系统

2023-05-16

数据结构的第二个课程设计,在c语言课程设计的基础上加以改进,(加强版),保存一下代码,对文件的处理,还是有一点一问题,还有待改进

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>/*屏幕操作函数库*/
struct node
{
    int num; //编号
    char name[10];//姓名
    char addr[20];//地址
    char telenum[20];//电话号码
};
typedef node telebook;
struct Lnode
{
    telebook data;
    Lnode *next;
};
typedef Lnode Link;
Link *L;//创建头节点

void Find_Num(Link *L);
void Find_Name(Link *L);
void Find_Tel(Link *L);
void DestoryLink(Link *L);

Link *CreatLink(Link* L)//创建
{
    Link *q,*p;
    FILE *fp;
    char flag='y';
    int i=0;
    L=(Link *)malloc(sizeof(Link)); //创建头节点
    q=L;//尾指针指向头指针
    if((fp=fopen("telebook.txt","ab+"))==NULL)/* 若读写打开二进制文件telebook.txt失败,则显示出错信息 */
        {
            printf("打开文件有误!");
            exit(0);
        }
    while(flag=='y')
    {
        p=(Link *)malloc(sizeof(Link));
        printf("录入信息:\n");
        printf("编号:\n");
        scanf("%d",&p->data.num);
        printf("姓名:\n");
        scanf("%s",p->data.name);
        printf("地址:\n");
        scanf("%s",p->data.addr);
        printf("电话号码:\n");
        scanf("%s",p->data.telenum);
        q->next=p;
        q=p;
        printf("继续添加?(y/n)\n");
        scanf("%s",&flag);
        while(flag!='y'&&flag!='n')
        {
            printf("输入错误,请重新输入\n");
            scanf("%s",&flag);
            i++;
            if(i>2)
                break;
        }
    }
    fwrite(q,sizeof(Link),1,fp);
    fclose(fp);
    q->next=NULL;
    return L;
}

void InsertLink(Link *L)//插入
{
   Link *q,*p;
   q=L;
   int j=0,i;
   printf("输入要插入的位置:\n");
   scanf("%d",&i);
   while(j<i-1&&q->next!=NULL)//查找第i-1个元素
   {
       j++;
       q=q->next;
   }
   if(q==NULL)//没有找到第i-1个元素
    printf("没有找到要插入的位置!\n");
   else
   {
       p=(Link *)malloc(sizeof(Link));
       printf("输入要插入的信息:\n");
       printf("编号:\n");
       scanf("%d",&p->data.num);
       printf("姓名:\n");
       scanf("%s",p->data.name);
       printf("地址:\n");
       scanf("%s",p->data.addr);
       printf("电话号码:\n");
       scanf("%s",p->data.telenum);
       p->next=q->next;
       q->next=p;
       printf("插入成功!\n");
   }
}

void PrintLink(Link *L)//显示
{
    Link *p;
    p=L;
    if(p==NULL||p->next==NULL) //链表为空
    printf("您的操作有误,请确保您的通讯录不为空!\n");
    else
    {
        p=L->next;
        while(p!=NULL)
        {
            printf("|  编号   |   姓名    |   电话号码     |     地址       |\n");
            printf("|---------|-----------|----------------|----------------|\n");
            printf("%-10d%-20s%-20s%-20s\n",p->data.num,p->data.name,p->data.telenum,p->data.addr);
            p=p->next;
        }
    }
}

void DeleteLink(Link *L)//删除
{
   Link *q,*p;
   q=L;
   int j=0,i,n;
   printf("1.删除整个通讯录\t\t2.删除某一个元素:\n");
   printf("请输入您的选择:\n");
   scanf("%d",&n);
   if(n==1)
   {
        if(q==NULL||q->next==NULL) //链表为空
        printf("您的操作有误,请确保您的通讯录不为空!\n");
        else
        DestoryLink(L);
   }
   else if(n==2)
      {
         printf("输入要删除的位置:\n");
          scanf("%d",&i);
          while(j<i-1&&q!=NULL)//查找第i-1个元素
            {
                j++;
                q=q->next;
            }
            if(q==NULL)
                printf("没有找到要删除的位置!\n");
            else
                {
                    p=(Link *)malloc(sizeof(Link));
                    p=q->next;
                    if(p==NULL)
                        printf("没有找到要删除的位置!\n");
                    q->next=p->next;
                    free(p);
                    printf("删除元素成功!\n");
                }
      }
      else
      {
        printf("输入错误,请重新输入\n");
        scanf("%d",&n);
      }
}

void DestoryLink(Link *L)//销毁线性表
{
    Link *p;
    p=L->next;
    while(p!=NULL)
    {
        L->next=p->next;
        free(p);//释放节点的内存
        p=L->next;
    }
    free(p);
}

void SearchLink(Link *L)//查询
{
   int n,flag=1;
   Link *q;
   q=L;
   if(q==NULL||q->next==NULL) //链表为空
   printf("您的操作有误,请确保您的通讯录不为空!\n");
   else
   {
       PrintLink(L);
       printf("你想通过什么方式查找?\n");
       printf("1.编号\t\t2.姓名\t\t3.电话号码\t4.返回\n");
       scanf("%d",&n);
       do{
            if(n==1) {Find_Num(L);return;}
            if(n==2) {Find_Name(L);return;}
            if(n==3) {Find_Tel(L);return;}
            if(n==4) {
                    system("cls");
                    return ;}
                    else{
                            flag=0;
                    printf("输入不正确,请重新输入:");
                    scanf("%d",&n);
                    }
            }
            while(flag==0);
  }
}

void Find_Num(Link *L) //按序号查询
{
    Link *q,*p;
    q=L->next;
    printf("输入要查询的编号:\n");
    p=(Link*)malloc(sizeof(Link));
    scanf("%d",&p->data.num);
    while(q!=NULL&&q->data.num!=p->data.num)
    {
        q=q->next;
    }
    if(q==NULL)
    {
        printf("通讯录中没有这个编号!\n");
    }
    else
    {
        printf("|  编号   |   姓名    |   电话号码     |     地址       |\n");
        printf("|---------|-----------|----------------|----------------|\n");
        printf("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum);
    }
}

void Find_Name(Link *L)//按姓名查询
{
    Link *q,*p;
    q=L->next;
    p=(Link*)malloc(sizeof(Link));
    printf("输入要查询的姓名:\n");
    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("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum);
    }
}

void Find_Tel(Link *L)//按电话号码查询
{
    Link *q,*p;
    q=L->next;
    p=(Link*)malloc(sizeof(Link));
    printf("输入要查询的电话号码:\n");
    scanf("%s",p->data.telenum);
    while(q!=NULL&&strcmp(q->data.telenum,p->data.telenum)!=0)
    {
        q=q->next;
    }
    if(q==NULL)
    {
        printf("通讯录中没有这个电话号码!\n");
    }
    else
    {
        printf("|  编号   |   姓名    |   电话号码     |     地址       |\n");
        printf("|---------|-----------|----------------|----------------|\n");
        printf("%-10d%-20s%-20s%-20s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum);
    }
}

void ChangeLink(Link *L)//修改
{
    Link *q;
    q=L;
    char s[20];
    int n,m;
    if(q==NULL||q->next==NULL) //链表为空
    printf("您的操作有误,请确保您的通讯录不为空!\n");
    else
    {
        PrintLink(L);
        printf("1.要修改的编号为:\t2.要修改的名字为:\t3.要修改的电话号码为:\n");
        printf("输入您的选择:\n");
        scanf("%d",&n);
        if(n==1)
            {
                printf("输入要修改的编号:\n");
                scanf("%d",&m);
                while(q!=NULL)
                    {
                        if(q->data.num==m)
                        {
                            printf("输入修改的信息:\n");
                            printf("编号:\n");
                            scanf("%d",&q->data.num);
                            break;
                        }
                        q=q->next;
            }
            if(q==NULL)
                printf("您要修改的信息不存在!\n");
            }
    else if(n==2)
    {
         printf("输入要修改的姓名:\n");
         scanf("%s",s);
         while(q!=NULL)
            {
                if(strcmp(q->data.name,s)==0)
                {
                 printf("输入修改的信息:\n");
                 printf("姓名:\n");
                 scanf("%s",q->data.name);
                 break;
                 }
                 q=q->next;
            }
             if(q==NULL)
                printf("您要修改的信息不存在!\n");
    }
    else if(n==3)
    {
         printf("输入要修改的电话号码:\n");
         scanf("%s",s);
         while(q!=NULL)
            {
                if(strcmp(q->data.telenum,s)==0)
                {
                 printf("输入修改的信息:\n");
                 printf("电话号码:\n");
                 scanf("%s",q->data.telenum);
                 break;
                 }
                 q=q->next;
            }
             if(q==NULL)
                printf("您要修改的信息不存在!\n");
    }
    else
    {
        printf("输入错误,请重新输入\n");
        scanf("%d",&n);
        getchar();
    }
    }
}

void Save(Link *L)//保存
{
    FILE*fp;
    Link *p;
    p=L;
    if((fp=fopen("telebook.txt","w"))==NULL)
    {
        printf("cannot open this file\n");
        exit(0);
    }
    if(p==NULL||p->next==NULL) //链表为空
      printf("您的操作有误,请确保您的通讯录不为空!\n");
      else
      {
           while(p!=NULL)
            {
                fprintf(fp,"%d%s%s%s\n",p->data.num,p->data.name,p->data.addr,p->data.telenum);
                fclose(fp);
                p=p->next;
            }
        printf("通讯录保存成功!\n");
      }
}

void Clear()//清屏函数
{
    system("pause");//输入任意键继续
    system("cls");//清屏
}

void Menu()//菜单
{
  printf("\t      ★☆★☆★【欢迎进入通讯录管理系统】★☆★☆★\n");
  printf("\t\t******************menu********************\n");
  printf("\t\t┌───────────────────┐\n");
  printf("\t\t\t ●a、    通讯信息录入\n");
  printf("\t\t\t ●b、    通讯信息插入\n");
  printf("\t\t\t ●c、    通讯信息显示\n");
  printf("\t\t\t ●d、    通讯信息保存\n");
  printf("\t\t\t ●e、    通讯信息删除\n");
  printf("\t\t\t ●f、    通讯信息修改\n");
  printf("\t\t\t ●g、    通讯信息查询\n");
  printf("\t\t\t    ◆Ⅰ、按编号查询\n");
  printf("\t\t\t    ◆Ⅱ、按姓名查询\n");
  printf("\t\t\t    ◆Ⅲ、按电话号码查询\n");
  printf("\t\t\t ●h、    退出系统\n");
  printf("\t\t└───────────────────┘\n");
  printf("\t\t******************************************\n");
  printf("请输入您的选择\n");
}
void Quit()//退出
{
    printf("\n\n\n\n\n");
    printf("\t\t★★★★★★★★★★★★★★★★★★★★★\n");
    printf("\t\t★★★★★★★感谢您的使用★★★★★★★★\n");
    printf("\t\t★★★★★★★欢迎再次使用★★★★★★★★\n");
    printf("\t\t★★★★★★★★★谢谢★★★★★★★★★★\n");
    printf("\n\n\n\n\n\t\t\t\t\t\tBy Mr.wang\n");
    exit(0);
}
int main()
{
    system("color 2E");/*改变控制台颜色*/
    char chioce;
    while(1)
    {
        Menu();
        scanf("%s",&chioce);
        switch(chioce)
        {
          case 'a':
               system("cls");
               L=CreatLink(L);
               Clear();
               break;
          case 'b':
            system("cls");
            InsertLink(L);
            Clear();
            break;
          case 'c':
              system("cls");
              PrintLink(L);
              Clear();
              break;
          case 'd':
            system("cls");
            Save(L);
            Clear();
            break;
          case 'e':
            system("cls");
            DeleteLink(L);
            Clear();
            break;
          case 'f':
            system("cls");
            ChangeLink(L);
            Clear();
            break;
          case 'g':
            system("cls");
            SearchLink(L);
            Clear();
            break;
          case 'h':
              system("cls");
              Quit();
              break;
          default :
             printf("您的输入有误,请重新输入:\n");
             Clear();
             break;
        }
    }
    return 0;
}

改进了一下保存的函数,处理文件,能够保存输入的文件了~

void Save(Link *L)//保存
{
    FILE*fp;
    Link *p,*q;
    p=L;
    if((fp=fopen("telebook.txt","a+"))==NULL)
    {
        printf("cannot open this file\n");
        exit(0);
    }
    if(p==NULL||p->next==NULL) //链表为空
      printf("您的操作有误,请确保您的通讯录不为空!\n");
      else
      {
           while(p->next!=NULL)
            {
                q=p->next;
                fprintf(fp,"%d %s %s %s\n",q->data.num,q->data.name,q->data.addr,q->data.telenum);
                p=p->next;
            }
          fclose(fp);
        printf("通讯录保存成功!\n");
      }
}

更新一下添加了可以按名字删除,按电话号码删除,按编号删除,先查询再删除;

void DeleteLink(Link *L)//删除菜单
{
   Link *q;
   q=L;
   int j=0,n;
   printf("\t1.删除整个通讯录\n\t2.按名字删除:\n\t3.按编号删除\n\t4.按电话号码删除\n");
   printf("\t请输入您的选择:\n");
   scanf("%d",&n);
    if(n==1)
   {
        if(q==NULL||q->next==NULL) //链表为空
        printf("您的操作有误,请确保您的通讯录不为空!\n");
        else
        DestoryLink(L);
   }
   else if(n==2)
   {
       Delete_name(L);
   }
    else if(n==3)
   {
       Delete_num(L);
   }
    else if(n==4)
   {
       Delete_Tel(L);
   }
     else
      {
        printf("输入错误,请重新输入\n");
        scanf("%d",&n);
      }
}

void Delete(Link *L,int i)//删除节点
{
   Link *q,*p;
   q=L;
   int j=0,n;
   while(j<i-1&&q!=NULL)//查找第i-1个元素
            {
                j++;
                q=q->next;
            }
            if(q==NULL)
                printf("没有找到要删除的位置!\n");
            else
                {
                    p=(Link *)malloc(sizeof(Link));
                    p=q->next;
                    if(p==NULL)
                        printf("没有找到要删除的位置!\n");
                    q->next=p->next;
                    free(p);
                    printf("删除元素成功!\n");
                }
}

void Delete_name(Link *L)//按名字删除
{
    int i;
    i=Find_Name(L);
    Delete(L,i);
}

void Delete_Tel(Link *L)//按电话号码删除
{
    int i;
    i=Find_Tel(L);
    Delete(L,i);
}

void Delete_num(Link *L)//按编号删除
{
    int i;
    i=Find_Num(L);
    Delete(L,i);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构课程设计之通讯录管理系统 的相关文章

随机推荐

  • Sphinx index.rst

    假设我们有两个文本file1 rst和file2 rst他们的内容如下 file1 rst span class hljs header file1 title1 61 61 61 61 61 61 61 61 61 61 61 61 sp
  • Git - 图形化界面操作

    目录 1 新建仓库 2 代码提交 3 代码回滚 4 新建分支 5 合并分支 6 重置合并 7 分支变基 8 分支优选 Git 的图形化界面操作 xff0c 使用 Idea 进行演示 1 新建仓库 对于一个代码仓库 Create Git re
  • CMakeLists

    1 指定 cmake 的最小版本 cmake minimum required VERSION 3 4 1 2 设置项目名称 xff0c 它会引入两个变量 demo BINARY DIR 和 demo SOURCE DIR xff0c 同时
  • 七步实现STM32MP157多核协同工作(Cortex-A7与Cortex-M4通信)

    写在前面 xff1a STM32MP157是ST进军Linux的首款微处理器 xff0c 采用MCU 43 MPU的组合 xff0c 集成两颗主频微800MHz的Cortex A7应用处理器内核 xff08 支持开源linux操作系统 xf
  • 【实战】STM32 FreeRTOS移植系列教程4:FreeRTOS 软件定时器

    写在前面 xff1a 本文章为 STM32MP157开发教程之FreeRTOS操作系统篇 系列中的一篇 xff0c 笔者使用的开发平台为华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 stm32mp157是
  • 【实战】STM32 FreeRTOS移植系列教程5:FreeRTOS消息队列

    写在前面 xff1a 本文章为 STM32MP157开发教程之FreeRTOS操作系统篇 系列中的一篇 xff0c 笔者使用的开发平台为华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 stm32mp157是
  • 学习嵌入式linux为什么推荐stm32mp157开发板?

    stm32mp157是ST推出的一款双A7 43 M4多核异构处理器 xff0c 既可以学习linux xff0c 又可以学习stm32单片机开发 xff0c 还可以拓展物联网 人工智能方向技术学习 xff0c 并极大丰富linux应用场景
  • STM32 Linux开发板——教程+视频+项目+硬件

    STM32 Linux开发板 适合入门进阶学习的Linux开发板 xff1a 华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 开发板介绍 FS MP1A开发板是华清远见自主研发的一款高品质 高性价比的Lin
  • 编程语言对比 面向对象

    C 43 43 面向对象 java面向对象 python面向对象 java中是public int a 61 10 C 43 43 中是 public int a 61 10 C 43 43 中有拷贝构造
  • 嵌入式linux物联网毕业设计项目智能语音识别基于stm32mp157开发板

    stm32mp157开发板FS MP1A是华清远见自主研发的一款高品质 高性价比的Linux 43 单片机二合一的嵌入式教学级开发板 开发板搭载ST的STM32MP157高性能微处理器 xff0c 集成2个Cortex A7核和1个Cort
  • CMake(一)

    CMake xff08 一 xff09 简述 在之前的文章中介绍了 qmake的使用 相比qmake xff0c CMake稍微复杂一点 xff0c 它使用CMakeList txt文件来定制整个编译流程 同时 xff0c CMake会根据
  • LTE网元功能

    LTE 网元功能 2015 03 30 22 33 31 分类 xff1a NetworkProtocols 举报 字号 订阅 下载LOFTER 我的照片书 主要网元功能 eNodeB Radio Resou
  • [C++] 32位C++程序,计算sizeof的值

    sizeof str 61 6 字符串数组 xff0c 大小是六个字节 加上 39 0 39 共六个 sizeof p 61 4 指针的内容就是一个指向目标地址的整数 xff0c 所以不管指向char int还是其他 xff0c 32位机指
  • 串口打印printf

    串口打印printf 1 配置串口2 添加代码3 使用MDK勾选Mircro LIB 1 配置串口 打开STM32CubeMX xff0c 创建工程 xff0c 配置串口 2 添加代码 重写fputc函数 xff0c 需要包含头文件 inc
  • 22.Ubuntu出现“由于没有公钥,无法验证下列签名”

    由于没有公钥 xff0c 无法验证下列签名 1 无公钥错误2 输入命令导入公钥3 注意 1 无公钥错误 使用sudo apt update时出现以下错误 xff1a 我图中的公钥就是 xff1a 3B4FE6ACC0B21F32 xff08
  • nyist 27 水池数目(dfs搜索)

    xfeff xfeff 水池数目 时间限制 xff1a 3000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 南阳理工学院校园里有一些小河和一些湖泊 xff0c 现在 xff0c 我们把它们通一看成水池 xff
  • XTUOJ 1176 I Love Military Chess(模拟)

    xfeff xfeff I Love Military Chess Accepted 45 Submit 141Time Limit 1000 MS Memory Limit 65536 KB 题目描述 陆军棋 xff0c 又称陆战棋 xf
  • 数据结构课程设计之一元多项式的计算

    数据结构不是听会的 xff0c 也不是看会的 xff0c 是练会的 xff0c 对于写这么长的代码还是心有余也力不足啊 xff0c 对于指针的一些操作 xff0c 也还是不熟练 xff0c 总出现一些异常错误 xff0c 对于数据结构掌握还
  • Unity官方文档(英文)

    地址 xff1a https docs unity3d com Manual UnityManual html
  • 数据结构课程设计之通讯录管理系统

    数据结构的第二个课程设计 xff0c 在c语言课程设计的基础上加以改进 xff0c xff08 加强版 xff09 xff0c 保存一下代码 xff0c 对文件的处理 xff0c 还是有一点一问题 xff0c 还有待改进 include l