动态通讯录

测试环境:vs2013

address_list.h文件

#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)

typedef struct A DataType;

typedef struct AddList
{
    DataType *arr;
    int capacity;//总空间大小
    int size;//有效元素个数
}AddList, *PAddList;


struct A
{
    char name[20];
    char sex[5];
    int age;
    char number[12];//因为电话一般为11位,int在32位机器下存不下
                    //因为scanf输入字符串会默认加'\0',所以为了使用strcmp函数,数组多申请
    char address[50];
};



void InitLinkman(PAddList ps, int capacity);//对联系人列表初始化
void CheckCapacity(PAddList ps);//对联系人列表空间扩容
void AddLinkman(PAddList ps);//添加联系人
void DeleLinkman(PAddList ps);//删除联系人
void FindLinkman(PAddList ps);//查找来联系人
void AlterLinkman(PAddList ps);//修改联系人
void ShowLinkman(PAddList ps);//打印联系人信息
void SortName(PAddList ps);
#endif

address_list.c文件

#include "address_list.h"

static void  print_Linkman(PAddList ps, int i)
{
    printf("%d\n姓名:%s\n性别:%s\n年龄:%d\n电话:%s\n住址:%s\n",
        i, (ps->arr + i)->name, (ps->arr + i)->sex, (ps->arr + i)->age, (ps->arr + i)->number, (ps->arr + i)->address);
}

void InitLinkman(PAddList ps, int capacity)
{
    if (NULL == ps)//说明联系人列表不存在
        return;
    ps->arr = (DataType *)malloc(sizeof(DataType)*capacity);
    if (ps->arr == NULL)
    {
        printf("申请空间失败!!!\n");
        return;
    }
    ps->capacity = capacity;
    ps->size = 0;
}

void CheckCapacity(PAddList ps)
{
    if (NULL == ps)
        return;
    ps->arr = (DataType *)realloc(ps->arr, (sizeof(DataType)*(ps->capacity) * 2));//扩增至原空间二倍
    if (ps->arr == NULL)
    {
        printf("申请空间失败!!!\n");
        return;
    }
    ps->capacity = 2 * ps->capacity;//申请空间成功
}

void AddLinkman(PAddList ps)
{
    if (NULL == ps)
        return;
    if (ps->size == ps->capacity)//说明空间已满
        CheckCapacity(ps);//对原空间进行扩容

    //动态顺序表的尾插
    printf("请输入联系人姓名>\n");
    scanf("%s", (ps->arr+ps->size)->name);
    printf("请输入联系人性别>\n");
    scanf("%s", (ps->arr + ps->size)->sex);
    printf("请输入联系人年龄>\n");
    scanf("%d", &((ps->arr + ps->size)->age));
    printf("请输入联系人电话号码>\n");
    scanf("%s", (ps->arr + ps->size)->number);
    printf("请输入联系人地址>\n");
    scanf("%s", (ps->arr + ps->size)->address);
    ps->size++;//添加成功

}

static void menu(int num)//这里的参数是为了区分不同函数的menu
{
    if (num == 1)
        printf("请输入要删除联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
    else if (num == 0)
        printf("请输入要查找联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
    else if (num == 2)
        printf("请输入要修改联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
    printf("*******************\n");
    printf("***0.exit 1.姓名***\n");
    printf("***2.性别 3.年龄***\n");
    printf("***4.电话 5.住址 ***\n");
}

void DeleLinkman(PAddList ps)
{
    int i = 0;
    int input = 0;
    if (NULL == ps)
        return;

    if (ps->size == 0)
    {
        printf("对不起,通讯录已空\n");
        return;
    }

    do
    {
        menu(1);
        scanf("%d", &input);

        switch (input)
        {
        case 0:
            break;
        case 1:
        {
                  char n[20];
                  printf("请输入联系人姓名\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr+i)->name, n) == 0)//说明找到要删除的联系人
                      {
                          int j = i;//就是从i位置删除元素
                          for (; j < ps->size - 1; j++)
                          {
                              ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
                          }
                          ps->size--;//删除成功
                          printf("已删除!\n");
                          return;
                      }

                  }
                printf("对不起,该联系人不存在!\n");

        }
            break;

        case 2:
        {
                  char n[5];
                  printf("请输入联系人性别\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->sex, n) == 0)
                      {
                          int j = i;
                          for (; j < ps->size - 1; j++)
                          {
                              ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
                          }
                          ps->size--;//删除成功
                          printf("已删除!\n");
                          return;
                      }

                  }

               printf("对不起,该联系人不存在!\n");
        }

            break;
        case 3:
        {
                   int n = 0;
                   printf("请输入联系人年龄\n");
                   scanf("%d", &n);

                   for (i = 0; i < ps->size; i++)
                   {
                       if ((ps->arr + i)->age == n)
                       {
                           int j = i;//就是从i位置删除元素
                           for (; j < ps->size - 1; j++)
                           {
                               ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
                           }
                           ps->size--;//删除成功
                           printf("已删除!\n");
                           return;
                       }
                   }

                printf("对不起,该联系人不存在!\n");   
        }
            break;
        case 4:
            {
                char n[12];
                printf("请输入联系人电话\n");
                scanf("%s", n);

                for (i = 0; i < ps->size; i++)
                {
                    if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
                    {
                        int j = i;//就是从i位置删除元素
                        for (; j < ps->size - 1; j++)
                        {
                            ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
                        }

                        ps->size--;//删除成功
                        printf("已删除!\n");
                        return;
                    }
                }
            printf("对不起,该联系人不存在!\n");

            }
            break;
        case 5:
        {
                  char n[50];
                  printf("请输入联系人住址\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
                      {
                          int j = i;//就是从i位置删除元素
                          for (; j < ps->size - 1; j++)
                          {
                              ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
                          }

                          ps->size--;//删除成功
                          printf("已删除!\n");
                          return;
                      }
                  }
                printf("对不起,该联系人不存在!\n");

        }

            break;
        default :
            printf("输入错误,请重新输入\n");
            break;
        }

    } while (input);


}

void FindLinkman(PAddList ps)
{
    int i = 0;
    int input = 0;
    if (NULL == ps)
        return;

    if (ps->size == 0)
    {
        printf("对不起,通讯录已空\n");
        return;
    }

    do
    {
        menu(0);
        scanf("%d", &input);

        switch (input)
        {
        case 0:
            break;
        case 1:
        {
                  char n[20];
                  printf("请输入联系人姓名\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->name, n) == 0)//说明找到要删除的联系人
                      {
                          print_Linkman(ps, i);
                          return;
                      }

                  }
                  printf("对不起,该联系人不存在!\n");

        }
            break;

        case 2:
        {
                  char n[5];
                  printf("请输入联系人性别\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->sex, n) == 0)
                      {
                          print_Linkman(ps, i);
                          return;
                      }

                  }

                  printf("对不起,该联系人不存在!\n");
        }

            break;
        case 3:
        {
                  int n = 0;
                  printf("请输入联系人年龄\n");
                  scanf("%d", &n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if ((ps->arr + i)->age == n)
                      {
                          print_Linkman(ps, i);
                          return;
                      }
                  }

                  printf("对不起,该联系人不存在!\n");
        }
            break;
        case 4:
        {
                  char n[12];
                  printf("请输入联系人电话\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
                      {
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }
            break;
        case 5:
        {
                  char n[50];
                  printf("请输入联系人住址\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
                      {
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }

            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }

    } while (input);


}

void AlterLinkman(PAddList ps)
{
    int i = 0;
    int input = 0;
    do
    {
        menu(2);
        scanf("%d", &input);

        switch (input)
        {
        case 0:
            break;
        case 1:
        {
                  char n[20];
                  printf("请输入需要修改联系人的姓名\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->name, n))//说明找到要删除的联系人
                      {
                          printf("请输入修改后联系人的姓名\n");
                          scanf("%s", (ps->arr + i)->name);
                          printf("修改后的信息为>\n");
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }

            break;
        case 2:
        {
                  char n[5];
                  printf("请输入联系人性别\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->sex, n))//说明找到要删除的联系人
                      {
                          printf("请输入修改后联系人的性别\n");
                          scanf("%s", (ps->arr + i)->sex);
                          printf("修改后的信息为>\n");
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }

            break;
        case 3:
        {
                  int n = 0;
                  printf("请输入联系人年龄\n");
                  scanf("%d", &n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if ((ps->arr + i)->age == n)//说明找到要删除的联系人
                      {
                          printf("请输入修改后联系人的年龄\n");
                          scanf("%d", &((ps->arr + i)->age));
                          printf("修改后的信息为>\n");
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }
            break;
        case 4:
        {
                  char n[12];
                  printf("请输入联系人电话\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
                      {
                          printf("请输入修改后联系人电话\n");
                          scanf("%s", (ps->arr + i)->number);
                          printf("修改后的信息为>\n");
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");
        }

            break;
        case 5:
        {
                  char n[50];
                  printf("请输入联系人住址\n");
                  scanf("%s", n);

                  for (i = 0; i < ps->size; i++)
                  {
                      if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
                      {
                          printf("请输入修改后联系人的地址\n");
                          scanf("%s", (ps->arr + i)->address);
                          printf("修改后的信息为>\n");
                          print_Linkman(ps, i);
                          return;
                      }
                  }
                  printf("对不起,该联系人不存在!\n");

        }

            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }

    } while (input);

}

void ShowLinkman(PAddList ps)
{
    int i = 0;
    if (NULL == ps)
        return;
    if (ps->size == 0)
    {
        printf("对不起,通讯录为空\n");
        return;
    }
    for (; i < ps->size; i++)
    {
        print_Linkman(ps, i);
    }
}

void SortName(PAddList ps)
{
    int i = 0;
    if (NULL == ps)
        return;
    if (ps->size == 0)
    {
        printf("联系人列表为空!!!\n");
        return;
    }
    for (i = 0; i < ps->size-1; i++)
    {
        int j = 0;
        for (j = 0; j < ps->size - i - 1; j++)
        {
            if (strcmp((ps->arr + j)->name, (ps->arr + j + 1)->name) > 0)//这里是从小到大排序,如果进去,交换结构体变量
            {
                DataType obj;
                obj = *(ps->arr + j);
                *(ps->arr + j) = *(ps->arr + j + 1);
                *(ps->arr + j + 1) = obj;
            }
        }
    }
}

test.c文件

#include <stdio.h>
#include <windows.h>
#include "address_list.h"
#pragma warning(disable:4996)



static void menu()
{
    printf("*****************************\n");
    printf("******0.exit    1.Add  *******\n");
    printf("******2.Delete  3.Find *******\n");
    printf("******4.Alter   5.Show *******\n"); 
    printf("******6.Empty   7.Sort *******\n");
    printf("******************************\n");
}


int main()
{
    int input = 0;
    int capacity = 3;
    AddList List;
    PAddList ps = &List;

    InitLinkman(ps, capacity);//先将结构体数组中的成员flag全都初始化为0,表示空,都可以存信息

    do
    {
        menu();
        scanf("%d", &input);

        switch (input)
        {
        case 0:
            break;
        case 1:
            AddLinkman(ps);
            break;
        case 2:
            DeleLinkman(ps);
            break;
        case 3:
            FindLinkman(ps);//查找指定联系信息
            break;
        case 4:
            AlterLinkman(ps);//修改联系人
            break;
        case 5:
            ShowLinkman(ps);//显示所有联系人
            break;
        case 6:
            InitLinkman(ps, capacity);
            break;
        case 7:
            SortName(ps);//以名字排序所有联系人
            break;
        default:
            printf("选择错误\n");

        }

    } while (input);

    system("pause");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/virgofarm/article/details/79921599