单链表的应用---通讯录设计(数据结构课设)

一、实验目的

        1)熟悉并掌握线性表的逻辑结构、物理结构;

        2)熟悉并掌握线性链表的存储结构、基本操作和具体函数的定义;

二、实验内容

        设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功能,实现通讯录所有操作的管理。

        1)通讯录链表的建立。

        2)通讯者信息的插入

        3)通讯者信息的查找,查找成功,将查找者的信息输出。

        4)通讯者记录的删除,要求先进行通讯者的查找,查找成功后确定是否删除。确定之后才实现删除功能。

        5)通讯者信息修改,先输入通讯者关键信息进行查询(如编号、身份证号码、姓名等),查找到进行修改,查找不到返回无此通讯者信息;

        6)通讯录链表的显示,按照编号有序输出所有通讯者的信息。

三、实验步骤

        1)定义单链表;

        2)初始链表;

        3)定义main函数,实现通讯录菜单;

        4)定义插入通讯录信息函数;

        5)定义查询通讯录信息函数;

        6)定义删除通讯录信息函数;

        7)定义修改通讯录信息函数。

四、算法流程图

流程图1 

流程图2 

流程图3 

五、实现代码

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define N 100
typedef struct{ //通讯录结点类型,应包含,编号、姓名、联系方式、通讯地址等信息
    char num[N];//编号
    char name[N];//姓名
    char phone[N];//电话号码
    char add[N];//地址
}DataType;
typedef struct node {   //结点类型定义——单链表(数据域、指针域)
    DataType data;
    struct node *next;
}ListNode,*LinkList;
typedef ListNode *LinkList; //定义单链表
LinkList head;
ListNode *p;
void CreateList(LinkList &L){            //尾插法建立带头结点的通讯录链表算法
    int i,n;
    L=(LinkList)malloc(sizeof(ListNode));
    ListNode *p,*q=L;
    printf("请输入员工人数:");
    scanf("%d",&n);
    for (i=1;i<=n;i++){
        p=(LinkList)malloc(sizeof(ListNode));
        printf("请输入第%d个员工信息:\n",i);
        printf("编号:");//输入元素值
        scanf("%s",p->data.num);
        printf("姓名:");
        scanf("%s",p->data.name);
        printf("联系方式:");
        scanf("%s",p->data.phone);
        printf("通讯地址:");
        scanf("%s",p->data.add);
        p->next=q->next;
        q->next=p;
        q=p;
    }
    q->next=NULL;
}
void InsertNode(LinkList &head)//插入员工信息
{
    ListNode *p,*q;
    q=head->next;
    p=new ListNode[sizeof(ListNode)];//创建一个新节点
    printf("请输入要插入的员工信息:\n");
    printf("编号:");
    scanf("%s",p->data.num);
    while (q){
        if (strcmp(q->data.num,p->data.num)==0){
            printf("该员工已存在!");
            break ;
        }
        q=q->next;
    }
    if (q==NULL){
        printf("姓名:");
        scanf("%s",p->data.name);
        printf("联系方式:");
        scanf("%s",p->data.phone);
        printf("通讯地址:");
        scanf("%s",p->data.add);
        p->next=head->next;
        head->next=p;
    }
}
void revise(LinkList &head)//修改员工信息
{
    ListNode *p;
    p=head->next;
    int k=0;
    char num1[N];
    printf("请输入需要修改员工的编号:");
    scanf("%s",&num1);
    while(p){
        if (strcmp(p->data.num,num1)==0){
            k=1;
            break;
        }
        p=p->next;
    }
    if (k){
        printf("请输入修改后的员工信息:\n");
        printf("姓名:");
        scanf("%s",p->data.name);
        printf("联系方式:");
        scanf("%s",p->data.phone);
        printf("通讯地址:");
        scanf("%s",p->data.add);
    }else{
        printf("编号为%s的员工不存在!\n",num1);
    }
}
void PrintList(LinkList &head) //输出链表
{
    ListNode P;
    p=head->next;
    printf("编号\t姓名\t联系方式\t通讯地址\n");
    while (p){
        printf("%s\t",p->data.num);
        printf("%s\t",p->data.name);
        printf("%s\t\t",p->data.phone);
        printf("%s",p->data.add);
        printf("\n");
        p=p->next;
    }
}
void ListFind1(LinkList head)
{// 有序通讯录链表上的查找
    ListNode *p;
    int op;
    char num1[N],name1[N];
    p=head->next;
    int k=0;
    printf("==================\n");
    printf("  1. 按编号查询     \n");
    printf("  2. 按姓名查询     \n");
    printf("==================\n");
    printf("请选择:");
    scanf("%d",&op);
    switch (op){
        case 1:{
            printf("请输入需要查找的员工编号:");
            scanf("%s",&num1);
            while (p){
                if (strcmp(p->data.num,num1)==0){
                    k=1;
                    break;
                }
                p=p->next;
            }
            if (k){
                printf("编号:%s\n",p->data.num);
                printf("姓名:%s\n",p->data.name);
                printf("联系方式:%s\n",p->data.phone);
                printf("通讯地址:%s\n",p->data.add);
                printf("\n");
            }
            else{
                printf("编号为%s的员工不存在!\n",num1);
            }
            break;
        }
        case 2:{
            printf("请输入需要查找的员工姓名:");
            scanf("%s",&name1);
            while (p){
                if (strcmp(p->data.name,name1)==0){
                    k=1;
                    break;
                }
                p=p->next;
            }
            if (k){
                printf("编号:%s\n",p->data.num);
                printf("姓名:%s\n",p->data.name);
                printf("联系方式:%s\n",p->data.phone);
                printf("通讯地址:%s\n",p->data.add);
                printf("\n");
            }
            else{
                printf("姓名是%s的员工不存在!\n",name1);
            }
            break;
        }
    }
}
void DelNode(LinkList &head)
{
    ListNode *p=head->next;
    ListNode *q=head;
    int op;
    char a;
    char num1[N],name1[N];
    p=head->next;
    printf("==================\n");
    printf("  1. 按编号查询     \n");
    printf("  2. 按姓名查询     \n");
    printf("==================\n");
    printf("请选择:");
    scanf("%d",&op);
    switch (op){
        case 1:{
            printf("请输入需要删除的员工编号:");
            scanf("%s",&num1);
            while (p&&strcmp(p->data.num,num1)!=0){
                p=p->next;
                q=q->next;
            }
            if (p==NULL) {
                printf("没有查到要删除的通讯者!\n");
                break ;
            }
            if (p){
                printf("真的要删除该员工吗?(y/n):\n");
                //待续…………………………
                printf("请选择:");
                scanf("%s",&a);
                if (a=='y'){
                    printf("删除成功!");
                    q->next=p->next;
                    free(p);
                }
            }
            else if(a=='n') break ;
            break;
        }
        case 2:{
            printf("请输入需要删除的员工姓名:");
            scanf("%s",&name1);
            while (p&&strcmp(p->data.name,name1)!=0){
                p=p->next;
                q=q->next;
            }
            if (p==NULL) {
                printf("没有查到要删除的通讯者!\n");
                break ;
            }
            if (p){
                printf("真的要删除该员工吗?(y/n):\n");
                //待续…………………………
                printf("请选择:");
                scanf("%s",&a);
                if (a=='y'){
                    printf("删除成功!");
                    q->next=p->next;
                    free(p);
                }
            }
            else if(a=='n') break ;
            break;
        }
    }
}
//主函数
int main()
{
    //良好的菜单引导程序功能
    //如1:建立;2:添加;3:查询;4删除;5:修改;6:显示;0:退出;
    LinkList L;
    int op;
    printf("**************通讯录*************\n");
    printf("\t1、建立员工信息\n\t2、添加员工信息\n\t3、查询员工信息\n\t4、删除员工信息\n\t5、修改员工信息\n\t6、显示通讯录\n\t0、退出系统\n");
    printf("**********************************\n");
    while (1){
        printf("请选择相应的功能:");
        scanf("%d",&op);
        if (op==0) break;
        switch (op){
            case 1:{
                CreateList(L);
                printf("\n");
                break;
            }
            case 2:{
                InsertNode(L);
                printf("\n");
                break;
            }
            case 3:{
                ListFind1(L);
                printf("\n");
                break;
            }
            case 4:{
                DelNode(L);
                printf("\n");
                break;
            }
            case 5:{
                revise(L);
                printf("\n");
                break;
            }
            case 6:{
                PrintList(L);
                printf("\n");
                break;
            }
        }
    }
    return 0;
}

六、运行结果及分析 

1、建立员工信息(经验证员工信息建立成功) 

 图 1 建立员工信息

 图 2显示通讯录

2、查询员工信息(按编号查询或按姓名查询)

1.如果输入不存在的员工编号或姓名,则输出员工不存在。

 2.如果输入的员工编号或姓名存在,则输出对应的员工信息

 

 

3、删除员工信息(按编号删除或按姓名删除)

1.如果输入不存在的员工编号或姓名,则输出员工不存在。

2.如果输入的员工编号或姓名存在,则删除对应的员工信息

(在删除前还会询问是否真的要删除该员工(y/n),如果选择y,则删除员工,如果输入n则退出删除系统)

 

 经检验,对应员工已被删除。

4、添加员工信息

1.如果输入的员工编号已存在,则输出该员工已存在。

2.如果输入员工编号不重复,则添加该员工信息(经验证,该员工已添加)

5、修改员工信息

1.如果输入员工编号不存在,则输出员工不存在。

 2.如果输入员工编号存在,则输入需要修改的员工信息(经验证员工信息修改成功)

6、退出员工信息管理系统 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值