数据结构–学生通讯录管理系统

文章目录

  • 一、问题描述
  • 二、系统功能设计
  • 三、各个代码部分
  • 四、整体代码及其运行
  • 五、总结

前言

学生通讯录管理系统–C语言实现

一、问题描述

在现实中,用学号和姓名来记录学生需要花费大量的纸质材料,并且出现容易丢失、查找困难等问题。

“学生通讯管理系统”是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行查找和管理的一种应用程序。

二、系统功能设计

1、需要设计的功能有: 

  • 1、建立通讯录
  • 2、插入联系人信息
  • 3、删除联系人信息
    • 按序号删除
    • 按学号删除
    • 按姓名删除
  • 4、查找联系人信息
    • 按学号查找
    • 按姓名查找
  • 5、显示联系人信息
  • 6、退出通讯录系统

2、主界面如下: 

3、主界面代码如下: 

void menu()
{
    printf("------------------------欢迎来到学生通讯录管理系统-------------------------\n");
    printf("                            1.建立通讯录    \n");
    printf("                            2.插入联系人信息\n");
    printf("                            3.删除联系人信息\n");
    printf("                            4.查找联系人信息\n");
    printf("                            5.显示联系人信息\n");
    printf("                            6.退出系统管理  \n");
    printf("---------------------------------------------------------------------------\n");
}

三、各个代码部分

1、建立通讯录

1、主要以顺序存储结构进行存储

#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct
{
      char name[9];
      char tel[12];
}Address;
typedef Address ElemType;
typedef struct
{
      ElemType data[MAX];
      int len;
}AddressList;
//顺序存储结构

 2、后初始化顺序表,再进行创建

//顺序表初始化
AddressList * Init()
{
      AddressList * L;
      //为通讯录顺序表分配内存
      L=(AddressList *)malloc(sizeof(AddressList ));
      if(L==NULL)                    //判断内存分配是否成功
      {
            printf("内存分配失败,结束程序\n");
            exit(0);
      }
      else
      {
            L->len=0;                //将顺序表的长度设置为0
            return L;                 //返回顺序表的地址
      }
}

//创建顺序表
void Create(AddressList *L)
{
      ElemType x;              //用于存储顺序表元素
      int i=0,flag;            //用于标志
      flag=1;
      while(flag!=0)             //判断是否输入下一个元素
      {
            printf("请输入姓名:");      //输入元素中的姓名
            scanf("%s",x.name);
            printf("请输入学号:");     //输入元素中的电话
            scanf("%s",x.tel);
            //将输入的元素数据放置在顺序表中对应的位置
            strcpy(L->data[i].name ,x.name );
            strcpy(L->data[i].tel ,x.tel);
            L->len++;            //增加一个元素,顺序表的长度加1
            i++;
            printf("是否继续输入,继续请输入1,结束请输入0,请输入:");
            scanf("%d",&flag);               //输入标志
            getchar();  //去掉输入标志时输入的回车,为下次输入元素做好准备
      }
}

3、效果如下 

2、插入联系人信息 

//在顺序表的第i个位置插入一个元素
int Insert(AddressList *L)
{
        int i;
        printf("您要插入在第几个:");
        scanf("%d",&i);
        ElemType x;
        ElemType* p = &x;
        printf("联系人的姓名为:");
        scanf("%s",p->name);
        printf("联系人的学号为:");
        scanf("%s",p->tel);
      int j;
      if(i>=1 && i<=L->len+1)
      {
            for(j=L->len -1;j>=i-1;j--)
            {
                strcpy(L->data[j+1].name ,L->data[j].name );
                strcpy(L->data[j+1].tel ,L->data[j].tel );
            }
            strcpy(L->data[i-1].name ,x.name );
            strcpy(L->data[i-1].tel ,x.tel );
            L->len ++;  //插入一个元素,顺序表的长度加1
            printf("插入成功,通讯录信息为:\n");
            Output(L);
            return 1;                //插入成功返回1
      }
      else
      {
            printf("无法插入,插入的位置不合法\n");
            return  0;       //插入失败返回0
      }
}

效果如下: 

 

3、删除联系人信息 

1、按序号删除 

2、按姓名删除

3、按学号删除

//在顺序表的第i个位置删除一个元素
int  Delete(AddressList *L,int i)
{
      int j;
      if(i>=1&&i<=L->len){
            for(j=i ;j<=L->len-1;j++)
            {
                L->data[i-1] = L->data[j];
            }
            L->len--;
            printf("已成功删除第%d个\n",i);
            printf("删除成功后显示为:\n");
            Output(L);
            return 1;               //删除成功返回1
      }
      return -1;
}
void deleteway(AddressList *L1)
{
        int m;
        printf("删除的方式为:1、按顺序,2、按姓名,3、按学号\n");
        scanf("%d",&m);
            if(m==1){
            int x;
            printf("您要删除第几个:");
            scanf("%d",&x);
            Delete(L1,x);
        }
        if(m==2){
            char name[MAX];
            printf("请输入姓名:");
            scanf("%s",name);
            int i = FindByname(L1,name)+1;
            Delete(L1,i);
        }
        if(m==3){
            char tel[MAX];
            printf("请输入学号:");
            scanf("%s",tel);
            int i = FindBytel(L1,tel)+1;
            Delete(L1,i);
        }
}

4、查找联系人信息

1、按姓名查找

2、按学号查找

//查找联系人信息
void SearchContact(AddressList *L)
{
    int x;
    printf("请输入查找的方式:1、按姓名 2、按学号\n");
    scanf("%d",&x);
    if(x==1){
        char name[MAX];
        printf("请输入姓名:");
        scanf("%s",name);
        int i = 0;
        i = FindByname(L,name);
            printf("你要找的人的信息为:");
            printf("姓名:%s 学号:%s\n",L->data[i].name,L->data[i].tel);
    }else if(x==2){
        char tel[MAX];
        printf("请输入学号:");
        scanf("%s",tel);
        int i = 0;
        i = FindBytel(L,tel);
            printf("你要找的人的信息为:");
            printf("姓名:%s 学号:%s\n",L->data[i].name,L->data[i].tel);
    }else{
        printf("输入方式有误!\n");
    }
}
//按姓名查找
int FindByname(AddressList *L,char name[])
{
    int i;
    for(i=0;i<=L->len+1;i++)
    {
        if(strcmp(L->data[i].name,name) == 0)
        {
            return i;
        }
    }
    return -1;
}
//按学号查找
int FindBytel(AddressList *L,char name[])
{
    int i;
    for(i=0;i<L->len;i++)
    {
        if(strcmp(L->data[i].tel,name) == 0)
        {
            return i;
        }
    }
    return -1;
}

5、 显示联系人信息

//显示联系人所有信息
void Output(AddressList *L)

{
      int i;
      for(i=0;i<=L->len -1;i++)
            printf("姓名:%s, 学号:%s\n", L->data[i].name ,L->data[i].tel );

}

四、整体代码及其整体运行 

1、所有代码如下:建议将子函数放在另一个文件里,与主函数区分开。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct
{
      char name[9];
      char tel[12];
}Address;
typedef Address ElemType;
typedef struct
{
      ElemType data[MAX];
      int len;
}AddressList;
//初始化顺序表


void menu();//显示要操作的项目

AddressList * Init();//对通讯录进行初始化
void Create(AddressList *L);//创造通讯录各个成员的信息

int Insert(AddressList *L);//对通讯录插入成员的信息

int  Delete(AddressList *L,int i);//按顺序删除成员信息
void deleteway(AddressList *L1);//按照名字或学号删除成员信息

void SearchContact(AddressList *L);//对要查询的成员进行提示操作
int FindByname(AddressList *L,char name[]);//按照名字查找成员信息
int FindBytel(AddressList *L,char name[]);//按照学号查找成员信息

void Output(AddressList *L);//显示通讯录各个成员的信息


int main()
{
    AddressList *L1;
    menu();
    printf("请选择要运行的项目:");
    int a;
    scanf("%d",&a);
        while(a!=6){
            switch(a)
            {
                case 1:
                    L1 = Init();
                    Create(L1);
                    break;
                case 2:
                    Insert(L1);
                    break;
                case 3:
                    deleteway(L1);
                    break;
                case 4:
                    SearchContact(L1);
                    break;
                case 5:
                    Output(L1);
                    break;
                default:
                    printf("输入错误!");
            }
        printf("请选择要运行的项目:");
        scanf("%d",&a);
        }
    printf("您已成功退出系统!");
    return 0;
}



void menu()
{
    printf("------------------------欢迎来到学生通讯录管理系统-------------------------\n");
    printf("                            1.建立通讯录    \n");
    printf("                            2.插入联系人信息\n");
    printf("                            3.删除联系人信息\n");
    printf("                            4.查找联系人信息\n");
    printf("                            5.显示联系人信息\n");
    printf("                            6.退出系统管理  \n");
    printf("---------------------------------------------------------------------------\n");
}


//顺序表初始化
AddressList *Init()
{
      AddressList * L;
      //为通讯录顺序表分配内存
      L=(AddressList *)malloc(sizeof(AddressList ));
      if(L==NULL)                    //判断内存分配是否成功
      {
            printf("内存分配失败,结束程序\n");
            exit(0);
      }
      else
      {
            L->len=0;                //将顺序表的长度设置为0
            return L;                 //返回顺序表的地址
      }
}

//创建顺序表
void Create(AddressList *L)
{
      ElemType x;              //用于存储顺序表元素
      int i=0,flag;            //用于标志
      flag=1;
      while(flag!=0)             //判断是否输入下一个元素
      {
            printf("请输入姓名:");      //输入元素中的姓名
            scanf("%s",x.name);
            printf("请输入学号:");     //输入元素中的电话
            scanf("%s",x.tel);
            //将输入的元素数据放置在顺序表中对应的位置
            strcpy(L->data[i].name ,x.name );
            strcpy(L->data[i].tel ,x.tel);
            L->len++;            //增加一个元素,顺序表的长度加1
            i++;
            printf("是否继续输入,继续请输入1,结束请输入0,请输入:");
            scanf("%d",&flag);               //输入标志
            getchar();  //去掉输入标志时输入的回车,为下次输入元素做好准备
      }
}

//在顺序表的第i个位置插入一个元素
int Insert(AddressList *L)
{
        int i;
        printf("您要插入在第几个:");
        scanf("%d",&i);
        ElemType x;
        ElemType* p = &x;
        printf("联系人的姓名为:");
        scanf("%s",p->name);
        printf("联系人的学号为:");
        scanf("%s",p->tel);
      int j;
      if(i>=1 && i<=L->len+1)
      {
            for(j=L->len -1;j>=i-1;j--)
            {
                strcpy(L->data[j+1].name ,L->data[j].name );
                strcpy(L->data[j+1].tel ,L->data[j].tel );
            }
            strcpy(L->data[i-1].name ,x.name );
            strcpy(L->data[i-1].tel ,x.tel );
            L->len ++;  //插入一个元素,顺序表的长度加1
            printf("插入成功,通讯录信息为:\n");
            Output(L);
            return 1;                //插入成功返回1
      }
      else
      {
            printf("无法插入,插入的位置不合法\n");
            return  0;       //插入失败返回0
      }
}



//在顺序表的第i个位置删除一个元素
int  Delete(AddressList *L,int i)
{
      int j;
      if(i>=1&&i<=L->len){
            for(j=i ;j<=L->len-1;j++)
            {
                L->data[i-1] = L->data[j];
            }
            L->len--;
            printf("已成功删除第%d个\n",i);
            printf("删除成功后显示为:\n");
            Output(L);
            return 1;               //删除成功返回1
      }
      return -1;
}
void deleteway(AddressList *L1)
{
        int m;
        printf("删除的方式为:1、按顺序,2、按姓名,3、按学号\n");
        scanf("%d",&m);
            if(m==1){
            int x;
            printf("您要删除第几个:");
            scanf("%d",&x);
            Delete(L1,x);
        }
        if(m==2){
            char name[MAX];
            printf("请输入姓名:");
            scanf("%s",name);
            int i = FindByname(L1,name)+1;
            Delete(L1,i);
        }
        if(m==3){
            char tel[MAX];
            printf("请输入学号:");
            scanf("%s",tel);
            int i = FindBytel(L1,tel)+1;
            Delete(L1,i);
        }
}


//查找联系人信息
void SearchContact(AddressList *L)
{
    int x;
    printf("请输入查找的方式:1、按姓名 2、按学号\n");
    scanf("%d",&x);
    if(x==1){
        char name[MAX];
        printf("请输入姓名:");
        scanf("%s",name);
        int i = 0;
        i = FindByname(L,name);
            printf("你要找的人的信息为:");
            printf("姓名:%s 学号:%s\n",L->data[i].name,L->data[i].tel);
    }else if(x==2){
        char tel[MAX];
        printf("请输入学号:");
        scanf("%s",tel);
        int i = 0;
        i = FindBytel(L,tel);
            printf("你要找的人的信息为:");
            printf("姓名:%s 学号:%s\n",L->data[i].name,L->data[i].tel);
    }else{
        printf("输入方式有误!\n");
    }
}
//按姓名查找
int FindByname(AddressList *L,char name[])
{
    int i;
    for(i=0;i<=L->len+1;i++)
    {
        if(strcmp(L->data[i].name,name) == 0)
        {
            return i;
        }
    }
    return -1;
}
//按学号查找
int FindBytel(AddressList *L,char name[])
{
    int i;
    for(i=0;i<L->len;i++)
    {
        if(strcmp(L->data[i].tel,name) == 0)
        {
            return i;
        }
    }
    return -1;
}


//显示联系人所有信息
void Output(AddressList *L)

{
      int i;
      for(i=0;i<=L->len -1;i++)
            printf("姓名:%s, 学号:%s\n", L->data[i].name ,L->data[i].tel );

}

2、整体运行结果如下: 

 五、总结

太多了不会?跟着我的代码敲,熟能生巧,一个一个模块去做,分治法大事化小。看着代码自己打一遍,能运行就是成功。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年6月25日
下一篇 2023年6月25日

相关推荐