单位员工通讯录管理系统(线性表的应用)

[问题描述]

为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。

[实现提示]

可以采用单链表的存储结构,如可定义如下的存储结构:

typedef struct {  /*员工通讯信息的结构类型定义*/

char num[5];       /*员工编号*/

char name[10];      /*员工姓名*/

char phone[15];     /*办公室电话号码*/

char call[15];     /*手机号码*/

char mail[25];      /*邮箱*/

}DataType;

/*通讯录单链表的结点类型*/

typedef struct node

{ DataType data;   /*结点的数据域*/

struct node *next;   /*结点的指针域*/

}ListNode,*LinkList;

源代码

// Address_List1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"stdio.h"
#include "stdlib.h"
# include <string>
#include <malloc.h>
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct {  /*员工通讯信息的结构类型定义*/
    char num[5];       /*员工编号*/
    char name[10];      /*员工姓名*/
    char phone[15];     /*办公室电话号码*/
    char call[15];     /*手机号码*/
    char mail[25];      /*邮箱*/
}DataType;
/*通讯录单链表的结点类型*/
typedef struct node
{
    DataType data;   /*结点的数据域*/
    struct node *next;   /*结点的指针域*/
}LNode, *LinkList;
void CreateList(LinkList &L)
{//逆位序输入n个元素的值,建立带表头结点的单链线性表L
    LinkList p;
    int i,n;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    cout << "请输入创建员工的通讯信息的个数:";
    cin >> n;
    for (i = 0; i<n; i++){
        p = (LinkList)malloc(sizeof(LNode));
        cout <<"     请输入员工信息"<<endl;
        cout << "      员工编号:";         cin>> p->data.num;
        cout << "      员工姓名:";         cin >> p->data.name;
        cout << "办公室电话号码:";   cin >> p->data.phone;
        cout << "      手机号码:";         cin >> p->data.phone;
        cout << "      员工邮箱:";         cin >> p->data.mail;
        cout << "================================" << endl;
        p->next = L->next;
        L->next = p;
    }

}
void InitList(LinkList &L)
{//初始化线性表
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
}
void DestroyList(LinkList &L)
{//销毁线性表
    LinkList p, q;
    p = L;
    q = p->next;
    while (q != NULL)
    {
        free(p);
    }
}
int ListEmpty(LinkList &L)
{//判断线性表是否为空
    if (L->next == NULL)
        return TRUE;
    else
        return FALSE;
}
int ListLength(LinkList &L)
{//求链表的长度
    LinkList p = L;
    int c = 0;
    while (p->next != NULL){
        c++;
        p = p->next;
    }
    return (c);

}
void GetElem(LinkList &L)
{//取链表第i个数据元素
    LinkList p = L->next;
    string s;
    cout << "输入员工的编号或名字:";
    cin >> s;
    while (p != NULL)//根据相关信息,查找员工。
    {
        if (p->data.num == s || p->data.name == s || p->data.phone == s || p->data.call == s || p->data.mail == s)
            break;    
        p = p->next;
    }
    if (!p)
        cout << "查无此人!" << endl;
    else{
        cout << "     员工信息" << endl;
        cout << "      员工编号:" << p->data.num << endl;
        cout << "      员工姓名:" << p->data.name << endl;
        cout << "办公室电话号码:" << p->data.phone << endl;
        cout << "      手机号码:" << p->data.phone << endl;
        cout << "      员工邮箱:" << p->data.mail << endl;
        cout << "================================" << endl;
    }
}
void ReviseList(LinkList &L)//修改信息
{
    LinkList p = L->next;
    char j[20];
    string s;
    int i;
    cout << "输入员工的编号或名字:";
    cin >> s;
    while (p != NULL) {//根据相关信息,查找员工。
        if (p->data.num == s || p->data.name == s || p->data.phone == s || p->data.call == s || p->data.mail == s)
            break;    
        p = p->next;
    }
    if (!p)
        cout << "查无此人!" << endl;
    else
    {
        cout << "\n想修改什么信息?_1-编号 2-姓名 3-办公室电话号码 4-手机号码 5-邮箱" << endl;
        cin >> i;
        cout << "想修改成什么?" << endl;
        cin >> j;
        switch (i) {
        case 1:strcpy_s(p->data.num, j); break;
        case 2:strcpy_s(p->data.name, j); break;
        case 3:strcpy_s(p->data.phone, j); break;
        case 4:strcpy_s(p->data.call, j); break;
        case 5:strcpy_s(p->data.mail, j); break;
        default: cout << "输入错误," << endl;
            system("pause");
        }
        cout << "修改完毕!";
        system("pause");
        return;
    }
}
void ListDelete(LinkList &L)
//删除第i个元素
{
    LinkList p, q;
    int j = 0,i;
    p = L;
    cout << "请输入你要删除第几个员工的信息:";
    cin >> i;
    while (p->next && j < i - 1){
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i - 1)//删除位置不合理
        cout << "删除位置不合理" << endl;
    q = p->next;
    p->next = q->next;//删除并释放结点
    free(q);
}
void ListInsert(LinkList &L)
{
    LinkList s, p = L;
    s = (LinkList)malloc(sizeof(LNode));
    cout << "     请输入员工信息" << endl;
    cout << "      员工编号:";         cin >> s->data.num;
    cout << "      员工姓名:";         cin >> s->data.name;
    cout << "办公室电话号码:";         cin >> s->data.phone;
    cout << "      手机号码:";         cin >> s->data.phone;
    cout << "      员工邮箱:";         cin >> s->data.mail;
    cout << "================================" << endl;
    s->next = p->next;
    p->next = s;
}

void PrintList(LinkList &L)
//打印线性表
{
    LinkList p = L->next;
    int i = 1;
    if (p == NULL)
        cout << "通讯录为空!" << endl;
    while (p != NULL)
    {
        cout << "第 "<<i<<" 个员工信息" << endl;
        cout << "      员工编号:" << p->data.num << endl;
        cout << "      员工姓名:" << p->data.name << endl;
        cout << "办公室电话号码:" << p->data.phone << endl;
        cout << "      手机号码:" << p->data.phone << endl;
        cout << "      员工邮箱:" << p->data.mail << endl;
        cout << "==============================" << endl;
        p = p->next;
        i++;
    }
    
}
void menu(){
    cout << "================================="<< endl;
    cout << "      1.建立新通讯录(逆序创建) " << endl;
    cout << "      2.查询通讯信息             " << endl;
    cout << "      3.修改员工信息             " << endl;
    cout << "      4.添加员工信息             " << endl;
    cout << "      5.删除员工信息             " << endl;
    cout << "      6.输出全部信息             " << endl;
    cout << "      7.通讯录的人数             " << endl;
    cout << "      0. 退出                    " << endl;
    cout << "=================================" << endl;

}
int _tmain(int argc, _TCHAR* argv[])
{
    int in;
    do{
        system("cls");
        LinkList  L;
        menu();
        cout << "请输入操作序号:";
        cin >> in;
        switch (in)
        {
        case 0:
            break;
        case 1://建立新通讯录
            CreateList(L);//逆位序建立线性表
            cout << "创建信息成功!";
            system("pause");
            break;
        case 2: {//查找
            GetElem(L);
            system("pause");
            break;
        }
        case 3:    //修改
            ReviseList(L);
            system("pause");
            cout << "修改信息成功!";
            break;
        case 4:            //添加
            ListInsert(L);
            cout << "添加信息成功!";
            system("pause");
            break;
        case 5:
            PrintList(L);
            ListDelete(L);
            cout << "删除信息成功!";
            system("pause");
            break;//输出全部信息
        case 6:
            PrintList(L);
            system("pause");
            break;
        case 7:
            cout << "该通讯录共有 " << ListLength(L) << " 员工信息!" << endl;;
            system("pause");
            break;
        default:
            cout << "输入错误!" << endl;
            system("pause");
        }
    } while (in != 0);
}

时间: 2024-10-27 01:52:31

单位员工通讯录管理系统(线性表的应用)的相关文章

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

数据结构的第二个课程设计,在c语言课程设计的基础上加以改进,(加强版),保存一下代码,对文件的处理,还是有一点一问题,还有待改进 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h>/*屏幕操作函数库*/ struct node { int num; //编号 char name[10];//姓名 char addr[20];//地址 char telenu

线性表——顺序表的实现与讲解(C++描述)

线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这种组织数据(同学)的方式我们可以称作线性表结构 定义 线性表:具有零个或多个(具有相同性质,属于同一元素的)数据元素的有限序列 若将线性表记为 ( a0 , a1 ,ai -1 ai ,ai +1 , ... , an - 1 , an ) 注意:i 是任意数字,只为了说明相对位置,下标即其在线性表

数据结构笔记之线性表

线性表即链表,基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他么个数据元素都有一个前驱和后继.是最基本且最常用的一种线性结构. 2.1线性表的定义和特点 由n(n>=0)个数据特性相同的元素否城的有限序列成为线性表,n为线性表长度,当n=0称空表. 举例:1.26个英文字母的字母表是一个线性表,数据元素是单个字母. 2.学生信息表中,每一个学生为一个数据元素,包括学号.姓名.性别等等数据项. 2.2案例:图书信息管理系统. 2.3线性表的类型定义 线性表是一个相当灵活的数据结构

顺序线性表

1 /** 2 * @brief 线性表的顺序表示与实现 3 * 4 * @author amur-leopard 5 * 6 * @date 2014/06/01 7 */ 8 #include <stdio.h> 9 #include <stdlib.h> 10 11 //-----------------预定义常量和类型------------------- 12 #define OK 1 13 #define ERROR 0 14 #define OVERFLOW -1 1

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

线性表的顺序表示与实现

#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef int Status; typedef int Elemtype;//用指定标识符Elemtype代表int类型,顾名思义表示元素类型为int型 typedef struc

数据结构与算法之----线性表

01线性表 1.线性表的判断方式就是元素有且只有一个直接前驱和直接后继,元素可以为空,此时叫做空表 2.抽象数据类型标准格式 ADT 抽象数据类型名 DATA 数据元素之间逻辑关系的定义 Operation 操作 endADT 3.操作伪代码 Operation InitList(*L): 初始化操作,建立一个空的线性表L ListEmpty(L): 判断线性表是否为空表,如果为空返回true,否则返回false ClearList(*L): 将线性表清空(实际情况不是删除元素,而是将内存中的元

小猪的数据结构辅助教程——2.1 线性表中的顺序表

小猪的数据结构辅助教程--2.1 线性表中的顺序表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.抽象数据类型(ADT)的概念,三要素:数据,数据元素间的关系和数据的操作 2.线性表的特点:按照一条线排列的数据集合,1对1,除了首元和尾元,其他元素都有直接前驱和直接后继 3.牢记线性表的存储结构,要理解并熟悉12个基本操作的逻辑,最好能徒手撕出代码 4.求并集,顺序表的经典例子,必须掌握! 1.抽象的数据类型 简单点说: 抽象:有点像我们面向对象语言中的类的思想,将事物

动态分配的顺序线性表的十五种操作—C语言实现

线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点:在非空有限的条件下,存在唯一的一个表头结点,唯一的一个表尾结点,除去第一个元素之外,每个数据元素都只有一个前驱,除去最后一个元素之外,每一个数据元素都只有一个后继. 注意:线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同特性(属于同一数据对象,类似数组).线性表的数据元素间有序