用单链表实现通讯录

/*********************************************************************************************************************************
File Name:      ******
Author:         ***    Date:    2016-12-08
Description:    用链表实现通讯录功能
Functionlist:   Create_List_Tail();//添加好友
                SelectSort();      //对好友进行升序排序
                Search();          //查找好友
                Delete_Node();     //删除好友
                DisPlayAll();      //显示所有好友信息
                DisPlay();         //打印当前创建好友
                Meun();            //主菜单
                FunMeun();         //功能菜单
                main();            //主函数
***********************************************************************************************************************************/            
                
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK            0
#define ERROR        -1
#define MALLOC_ERROR -2

typedef struct node
{
    long ID;              //ID号
    char Name[20];        //姓名
    char MobNum[13];      //手机号码
    char Addr[50];        //地址
    char CpyNum[13];      //公司电话
    struct node *next;    //结点指针
}Node;
typedef Node *PNode;      //重命名结点指针类型

//尾插法创建链表(添加好友信息)
int Create_List_Tail(PNode h, long ID, char *Name, char *MobNum, char *Addr, char *CpyNum)
{
    if (h == NULL)
    {
        return ERROR;
    }
    
    PNode node = (PNode)malloc(sizeof(Node)/sizeof(char));
    if (node == NULL)
    {
        return MALLOC_ERROR;
    }
    printf("创建用户\n");
    printf ("请输入ID:       ");
    scanf ("%ld", &node->ID);
    printf ("请输入姓名:     ");
    scanf ("%s", node->Name);
    printf ("请输入手机号码: ");
    scanf ("%s", node->MobNum);
    printf ("请输入家庭地址: ");
    scanf ("%s", node->Addr);
    printf ("请输入公司电话: ");
    scanf ("%s", node->CpyNum);
    
    node->next = NULL;
    
    //找到最后一个结点
    PNode temp = h;
    while (temp->next)
    {
        temp = temp->next;
    }
    temp->next = node;
    
    return OK;
    
}

//对链表用选择排序法进行升序排序(通过ID号)
PNode SelectSort(PNode head)
{
    PNode first;       //排列后有序链的表头指针
    PNode tail;      //排列后有序链的表尾指针
    PNode p_min;       //保留键值更小的节点的前驱节点的指针
    PNode min;       //存储最小节点
    PNode p;           //当前比较的节点
 
    first = NULL;
    while(head != NULL)          //在链表中找键值最小的节点
    {
        //注意:这里for语句就是体现选择排序思想的地方
        for (p = head, min = head; p->next != NULL; p = p->next)    //循环遍历链表中的节点,找出此时最小的节点
        {
            if ((p->next->ID) < (min->ID))     //找到一个比当前min小的节点
            {
                p_min = p;          //保存找到节点的前驱节点:显然p->next的前驱节点是p
                min = p->next;      //保存键值更小的节点
            }
        }
 
        //上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表
 
        //第一件事
        if (first == NULL)       //如果有序链表目前还是一个空链表
        {
            first = min;        //第一次找到键值最小的节点
            tail = min;           //注意:尾指针让它指向最后的一个节点
        }
        else              //有序链表中已经有节点
        {
            tail->next = min;       //把刚找到的最小节点放到最后,即让尾指针的next指向它
            tail = min;              //尾指针也要指向它
        }
 
        //第二件事
        if (min == head)            //如果找到的最小节点就是第一个节点
        {
            head = head->next;       //显然让head指向原head->next,即第二个节点,就OK
        }
        else            //如果不是第一个节点
        {
            p_min->next = min->next;    //前次最小节点的next指向当前min的next,这样就让min离开了原链表
        }
    }
 
    if (first != NULL)        //循环结束得到有序链表first
    {
        tail->next = NULL;    //单向链表的最后一个节点的next应该指向NULL
    }
    head = first;
    return head;
}
 

//查找好友
/* PNode Search(PNode h, char *Name)
{
    while (h && strcmp(h->Name,Name) != 0)
    {
        h = h->next;
    }
    
    if (h->next == NULL && strcmp(h->Name,Name) != 0)
    {
        printf ("Sorry 亲,无此好友 \n");        
    }
    return h;    
} */


//查找好友
void Search(PNode head, char *Name)
{
    PNode p = head;
    PNode q = NULL;

    while (p != NULL && (p->next) != NULL)
    {
        q = p->next;
        if (q != NULL && strcmp(q->Name,Name) == 0)
        {
            printf ("好友信息:  ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n", q->ID, q->Name, q->MobNum, q->Addr, q->CpyNum);
            return;
        }
        else if (q->next == NULL && strcmp(q->Name,Name) != 0)
        {
            printf ("Sorry 亲,您的通讯录没有该好友!\n");
            printf ("请重新输入主菜单指令: 0~4 \n");
        }
        p = p->next;
    }
}


//删除好友信息
void Delete_Node(PNode head, char *Name)
{
    PNode p = head;
    PNode q = NULL;

    while (p != NULL && (p->next) != NULL)
    {
        q = p->next;
        if (q != NULL && strcmp(q->Name,Name) == 0)
        {
            p->next = q->next;
            free(q);
            printf ("该好友已成功删除\n");
        }
        else if (q->next == NULL && strcmp(q->Name,Name) != 0)
        {
            printf ("Sorry亲,您的通讯录没有该好友!\n");
            printf ("请重新输入主菜单指令: 0~4 \n");
        }
        p = p->next;
    }
}

//打印当前所有结点(好友)
void DisPlayAll(PNode h)
{
    if (h == NULL)
    {
        return;
    }
    PNode temp = h->next;//链表第一个结点指针
    while (temp)
    {
        printf ("ID: %ld 姓名: %s 手机号码: %s 家庭地址: %s 公司电话: %s\n\n", temp->ID, temp->Name, temp->MobNum, temp->Addr, temp->CpyNum);
        temp = temp->next;
    }
    
    printf ("\n");
}

// 打印当前创建结点(好友)
void DisPlay(PNode h)
{
    if (h == NULL)
    {
        return;
    }
    PNode temp = h->next;  // 链表第一个结点指针
    while (temp)
    {
        if (temp->next == NULL)
        {
            printf ("\n\t......用户%s已成功创建......\n", temp->Name);
        }
        temp = temp->next;
    }
    
    printf ("\n");
}

//主菜单
int Menu()
{
    printf ("************************************************************\n");
    printf ("*                欢迎进入通讯录管理系统!                   *\n");
    printf ("************************************************************\n");
    printf ("*                    1)添加好友                            *\n");
    printf ("*                    2)列表好友信息                        *\n");
    printf ("*                    3)搜索好友                            *\n");
    printf ("*                    4)删除好友                            *\n");
    printf ("************************************************************\n");
    printf ("*********添加好友: 1       查看当前好友信息: 2**************\n");
    printf ("*********搜索好友: 3       删除好友:         4**************\n");
    printf ("******************显示主菜单: 0*****************************\n");
    printf ("************************************************************\n\n");    
}

//功能菜单
int FunMeun()
{
    printf ("\n\n");
    printf (" *    *   *****   *   *    ******      ****  功能选择:              \n");
    printf (" *    *   *       *   *   *      *      **                  \n");
    printf (" *    *   *       *   *   *      *      **      显示主菜单:       0\n");
    printf (" ******   *****   *   *   *      *      **      添加好友:         1\n");
    printf (" *    *   *       *   *   *      *              查看当前好友信息: 2\n");
    printf (" *    *   *       *   *   *      *      **      搜索好友:         3\n");
    printf (" *    *   *****   *   *    ******       **      删除好友:         4\n\n");
}

//功能选择函数
int Select()
{   
    int choice;
    while (1)
    {
        scanf("%d", &choice);
        if (!(choice>=0 && choice<=4))
        {
            printf ("\n\t输入错误,重选0-4:\n\n");
            continue;
        }
        else
        {
            break;
        }
    }
    return choice;
}


int main()
{
    long ID;              //ID号
    char Name[20];        //姓名
    char MobNum[13];      //手机号码
    char Addr[50];        //地址
    char CpyNum[13];      //公司电话
    
    
    PNode head_node = (PNode)malloc(sizeof(Node)/sizeof(char));
    if (head_node == NULL)
    {
        return ERROR;
    }
    head_node->next = NULL;
    
    Menu();//显示主界面
    while (1)
    {
        switch(Select())
        {
            case 0:
            {
                Menu();
            }break;
            
            case 1://添加好友
            {
                if (head_node)
                {
                    if (Create_List_Tail(head_node, ID, Name, MobNum, Addr, CpyNum) != OK)
                    {
                           return ERROR;
                    }
                }
                
                DisPlay(head_node);//打印当前好友创建信息
                head_node = SelectSort(head_node);  //创建完成就进行排序,防止后面程序出错
                FunMeun();
            }break;
            
            case 2://显示好友信息
            {
                printf ("*******************当前好友信息***********************\n");
                //head_node = SelectSort(head_node); //显示好友前先通过ID号对好友信息进行升序
                DisPlayAll(head_node);//显示所有好友信息
                FunMeun();
            }break;
            
            case 3://查找好友
            {
                printf ("请输入你要查找好友的姓名: \n");
                scanf ("%s", Name);
                Search(head_node,Name);
                FunMeun();        
            }break;
            
            case 4://删除好友
            {
                printf ("请输入要删除好友的姓名\n");
                scanf ("%s", Name);
                Delete_Node(head_node,Name);
                FunMeun();
            }break;
            
            default:
            {
                return ERROR;
            }
        }
    }
    
    
    
    return 0;
}


  • 11
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值