數據結構之動態通訊錄的實現

動態通訊錄包括了動態申請內存,
**插入聯繫人;
刪除聯繫人;
查找聯繫人;
排序聯繫人;
清空聯繫人;
修改聯繫人;
顯示所有聯繫人;**

下面來看代碼
首先,我們要做好我們的準備工作
**

adress.h

**

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

#define MAX 3
#define NAME_LENGTH 20
#define SEX_LENGTH 5
#define AGE_LENGTH 3
#define TELE_LENGTH 20
#define ADDR_LENGTH 30

typedef struct user{
    char name[NAME_LENGTH];
    char sex[SEX_LENGTH];
    char age[AGE_LENGTH];
    char tele[TELE_LENGTH];
    char addr[ADDR_LENGTH];
}user;

typedef struct contacts{
    user *person;
    int user_count;
    int capacity;
}contacts;

enum op
{
    EXIT,
    ADD,
    ERASE,
    CLEAR,
    FID,
    MODIFY,
    SHOW,
    SORT
};

int add_contacts(contacts *men);
int erase_contacts(contacts *men);
int clear_contacts(contacts *men);
int find_contacts(contacts *men);
int remove_contacts(contacts *men);
void sort_contacts(contacts *men);
void check(contacts *men);
void menu();

下面我們來看下一些輔助工作

#include "adress.h"
void menu()//打印服務菜單!!
{
    printf("===========服務菜單===========\n");
    printf("==============================\n");
    printf("          1.添加聯繫人\n");
    printf("          2.刪除聯繫人\n");
    printf("          3.清空聯繫人\n");
    printf("          4.查找聯繫人\n");
    printf("          5.修改聯繫人\n");
    printf("          6.顯示所有聯繫人\n");
    printf("          7.排序聯繫人\n");
    printf("          0.退出\n");
    printf("==============================\n");

}
void init_contacts(contacts *men)//初始化我們的通訊錄
{
    men->capacity = MAX;
    men->user_count = 0;
    men->person = (user *)malloc(sizeof(user)*MAX);
}
int _find(contacts *men)//輔助查找函數,成功返回查找的位置,失敗返回-1
{
    int i = 0;
    char name[NAME_LENGTH];
    printf("請輸入名字:");
    scanf("%s",name);
    for(i = 0;i < men->user_count;i++)
    {
        if(strcmp(men->person[i].name,name) == 0)
        {
            return i;
        }
    }
    return -1;
}

插入聯繫人函數

int add_contacts(contacts *men)
{
    if(men == NULL)
    {
        return -1;
    }
    if(men->user_count == men->capacity)
    {
        user *tmp = (user *)realloc(men->person,(men->capacity +3)*sizeof(user));
        if(tmp == NULL)
        {
            printf("內存不足\n");
            return -1;
        }
        else
        {
            men->person = tmp;
            (men->capacity)+= 3;
            return 1;
        }
    }
    else
    {
        printf("請輸入名字:");
        scanf("%s",men->person[men->user_count].name);
        printf("請輸入性別:");
        scanf("%s",men->person[men->user_count].sex);
        printf("請輸入年齡:");
        scanf("%s",men->person[men->user_count].age);
        printf("請輸入電話:");
        scanf("%s",men->person[men->user_count].tele);
        printf("請輸入地址:");
        scanf("%s",men->person[men->user_count].addr);
        printf("添加成功!\n");
        men->user_count++;
        return 1;
    }
}

刪除聯繫人函數

int erase_contacts(contacts *men)
{
    if( men == NULL )
    {
        return -1;
    }
    int i = 0;
    int ret = _find(men);
    if(ret == -1)
    {
        return -1;
    }
    for(i = ret;i < men->user_count-1;i++)
    {
        men->person[i] = men->person[i+1];
    }
    printf("刪除成功!\n");
    men->user_count--;
    return 1;
}

顯示聯繫人函數

void show_contacts(contacts *men)
{
    int i = 0;
    printf("%10s\t%4s\t%3s\t%13s\t%10s\n","姓名","性別","年齡","電話","地址");
    for(;i< men->user_count;i++)
    {
        printf("%10s\t%4s\t%3s\t%13s\t%10s\n",men->person[i].name,men->person[i].sex,
           men->person[i].age,men->person[i].tele,men->person[i].addr);
    }
    printf("\n");
}

清空通訊錄

int clear_contacts(contacts *men)
{
    if(men == NULL)
    {
        return -1;
    }
    men->user_count = 0;
    printf("清空成功!\n");
    return 1;
}

查詢聯繫人

int find_contacts(contacts *men)
{
    if(men == NULL)
    {
        return -1;
    }
    int ret = _find(men);
    if(ret == -1)
    {
        printf("找不到該聯繫人\n");
        return -1;
    }
    printf("該聯繫人的信息爲:\n");
    printf("姓名:%-5s\n",men->person[ret].name);
    printf("性別:%-5s\n",men->person[ret].sex);
    printf("年齡:%-5s\n",men->person[ret].age);
    printf("電話:%-5s\n",men->person[ret].tele);
    printf("地址:%-5s\n",men->person[ret].addr);
    return 1;
}

修改聯繫人

int remove_contacts(contacts *men)
{
    if(men == NULL)
    {
        return -1;
    }
    int ret = _find(men);
    if(ret == -1)
    {
        printf("該用戶不存在\n");
        return -1;
    }
    printf("請重新輸入該聯繫人信息\n");
    printf("請輸入名字:");
    scanf("%s",men->person[ret].name);
    printf("請輸入性別:");
    scanf("%s",men->person[ret].sex);
    printf("請輸入年齡:");
    scanf("%s",men->person[ret].age);
    printf("請輸入電話:");
    scanf("%s",men->person[ret].tele);
    printf("請輸入地址:");
    scanf("%s",men->person[ret].addr);
    printf("修改成功!\n");
    return 1;

}

排序聯繫人

void sort_contacts(contacts *men)
{
    if(men == NULL)
    {
        return;
    }
    int i = 0;
    int j = 0;
    for(i = 0;i < men->user_count-1;i++)
    {
        for(j = 0;j < men->user_count-1;j++)
        {
            if((strcmp(men->person[j].name,men->person[j+1].name)) > 0)
            {
                user tmp = men->person[j];
                men->person[j] = men->person[j+1];
                men->person[j+1] = tmp;
            }
        }
    }
    printf("排序完成!\n");
}

主函數

int main()
{
    int input = 1;
    contacts user;
    init_contacts(&user);
//    contacts user = {0};
//    user.capacity = MAX;
//    user.user_count = 0;
//    user.person = (user *)malloc(sizeof(user)*MAX);
    if(user.person == NULL)
    {
        printf("內存不足\n");
        return;
    }
    else
    {
        menu();
        while(input)
        {
            printf("請輸入數字編號\n");
            scanf("%d",&input);
            switch(input)
            {
            case ADD:
                add_contacts(&user);
                menu();
                break;
            case ERASE:
                erase_contacts(&user);
                menu();
                break;
            case CLEAR:
                clear_contacts(&user);
                menu();
                break;
            case FID:
                find_contacts(&user);
                menu();
                break;
            case MODIFY:
                remove_contacts(&user);
                menu();
                break;
            case SHOW:
                show_contacts(&user);
                menu();
                break;
            case SORT:
                sort_contacts(&user);
                show_contacts(&user);
                menu();
                break;
            case EXIT:
                printf("謝謝使用,再見!\n");
                break;
            dafault:
                printf("輸入錯誤,請重新輸入\n");
                break;
            }

        }

    }
    free(user.person);
    user.person = NULL;
    return 0;
}

下面是實現的結果演示
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章