[C language] address book - dynamic and static implementation

preface:

I believe everyone knows the address book

Its functions include: adding, deleting, checking and modifying

This issue is to realize an address book implemented in C language

Continue what we talked about last time-- Dynamic memory allocation

Then I will implement it in the two ways given in the title

I Implementation of static address book

1. Division logic of environment

Because the process is a little long and easy to understand, a total of three files will be used

There are two source files, test c,contact.c, there is also a header file contact H to achieve

test.c is the main body and the test logic of the address book

contact.c is the implementation logic of address book

contact.h is a declaration that implements the address book function

2. Functions to be realized

Each function of the address book is relatively independent

Therefore, different functions can be used to realize the functions of each part

contact.c contains the following functions:

1. Initialization of structure

2. Add contact

3. Show contacts

4. Delete contact

5. Find contacts

6. Modify contact

The specific codes are as follows:

3.contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//The address book can be used to store the information of 1000 people. Each person's information includes: name, gender, age, telephone number and address
typedef struct  Introduction
{
	char name[20];
	char sex[10];
	int  age;
	char tele[20];
	char addr[30];
} Introduction;
typedef struct contact
{
	Introduction data[1000];
	int sz;
}contact;

//Initialization of structure
void Initcontact(contact* pc);
//Add a Contact 
void Add(contact* pc);
//Show contacts
void show(contact* pc);
//Delete Contact 
void Dele(contact* pc);
//find contact 
void Find(contact* pc);
//Modify contact
void Exchange(contact* pc);

4.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void Initcontact(contact* pc)//Initialization of structure
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}

void Add(contact* pc)//Add a Contact 
{
    //Judge whether it is not full
    if (pc->sz == 1000)
    {
        printf("The address book is full\n");
        return;
    }
    printf("Please enter your name>: ");
    scanf("%s", pc->data[pc->sz].name);
    printf("Please enter age>: ");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("Please enter gender:>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("Please enter the phone number:>");
    scanf("%s", pc->data[pc->sz].tele);
    printf("Please enter the address:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("Contact added successfully\n");
}

void show(contact* pc)//Show contacts
{
    int i = 0;
    printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "name", "Age", "Gender", "Telephone", "address");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}

int SearchByName(contact* pc, char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

void Dele(contact* pc)//Delete Contact 
{
    int i = 0; char name[10];
    printf("Enter the name of the person to delete>: \n");
    scanf("%s", name);
    if (pc->sz == 0)
    {
        printf("The address book is empty and cannot be deleted\n");
    }
    //Determine whether there are contacts
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("Contact not found\n");
    }
    else
    {
        for (i = pos; i < pc->sz - 1; i++)
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
        printf("Contact deleted successfully\n");
    }
}


void Find(contact* pc)//find contact 
{
    char name[10];
    printf("Enter the name of the person you want to find>: \n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("There is no name in the address book");
    }
    else
    {
        printf("The person information found is:>");
        printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "name", "Age", "Gender", "Telephone", "address");
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
    }
}


void Exchange(contact* pc)//Modify contact
{
    char name[10];
    printf("Enter the name of the person to modify>: \n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("There is no modifier's name in the address book");
    }
    else
    {
        printf("Please enter your name>: ");
        scanf("%s", pc->data[pos].name);
        printf("Please enter age>: ");
        scanf("%d", &(pc->data[pos].age));
        printf("Please enter gender:>");
        scanf("%s", pc->data[pos].sex);
        printf("Please enter the phone number:>");
        scanf("%s", pc->data[pos].tele);
        printf("Please enter the address:>");
        scanf("%s", pc->data[pos].addr);
        printf("Modified successfully");
    }
}

5.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("**********************************************\n");
	printf("*******     1.Add        2.Dele      *********\n");
	printf("*******     3.Find       4.Exchange **********\n");
	printf("*******     5.show       0.exit     **********\n");
	printf("**********************************************\n");
}
int main()
{
	int input = 0;
	contact con;
    Initcontact(&con);
	do
	{
		menu();
		printf("Please enter a number>: ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Dele(&con);
			break;
		case 3:
			Find(&con);
			break;
		case 4:
			Exchange(&con);
			break;
		case 5:
			show(&con);
			break;
		case 0:
			printf("Exit address book\n");
			break;
		default:
			printf("Selection error\n");
		}

	} while (input);
	return 0;
}

6. Achieve results

II Implementation of Address Book Dynamic

Compared with the static implementation, the difference between the two is not big

The former uses a fixed array to store elements

The latter uses dynamically applied memory to realize storage, which has the advantage of saving memory

The difference is

For the initialization of address book, capcity capacity is referenced here to compare the existing capacity

To determine the amount of memory used for capacity expansion

The second is the Add function, which adds contacts

Finally, release the released memory

The code is as follows:

1.contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

typedef struct Introduction
{
	char name[20];
	char sex[10];
	int  age;
	char tele[20];
	char addr[30];
}Introduction;

typedef struct contact
{
	Introduction* data;
	int sz;
	int capcity;
}contact;

//Initialization of structure
void Initcontact(contact* pc);
//Add a Contact 
void Add(contact* pc);
//Show contacts
void show(contact* pc);
//Delete Contact 
void Dele(contact* pc);
//find contact 
void Find(contact* pc);
//Modify contact
void Exchange(contact* pc);
//Destroy address book
void destroy(contact*pc);

2.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#define TARGET_sz 3 / / initial address book target capacity 

void Initcontact(contact* pc)//Initialization of structure
{
    assert(pc);//Judge the validity of pointer
    pc->sz = 0;
    contact* tmp = 0;
    tmp=(contact*)malloc(sizeof(Introduction)*TARGET_sz);
    if (tmp!=NULL)
    {
        pc->data = tmp;
    }
    else
    {
        printf("Capacity expansion failed,Please check the reason\n");
        return;
    }
    pc->capcity = TARGET_sz;
}

void Add(contact* pc)//Add a Contact 
{
    assert(pc);
    if (pc->capcity == pc->sz)
    {
        Introduction* tmp = 0;
        tmp=(Introduction*)realloc(pc->data,sizeof(Introduction)*(pc->capcity+2));
        if (tmp != NULL)
        {
            pc->capcity += 2;
            pc->data = tmp;
            printf("Successful expansion\n");
        }
        else
        {
            printf("Capacity expansion failed. Please check the reason\n");
        }
    }
    printf("Please enter your name>: ");
    scanf("%s", pc->data[pc->sz].name);
    printf("Please enter age>: ");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("Please enter gender:>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("Please enter the phone number:>");
    scanf("%s", pc->data[pc->sz].tele);
    printf("Please enter the address:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("Contact added successfully\n");
}

void show(contact* pc)//Show contacts
{
    int i = 0;
    printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "name", "Age", "Gender", "Telephone", "address");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}

int SearchByName(contact* pc, char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

void Dele(contact* pc)//Delete Contact 
{
    int i = 0; char name[10];
    printf("Enter the name of the person to delete>: \n");
    scanf("%s", name);
    if (pc->sz == 0)
    {
        printf("The address book is empty and cannot be deleted\n");
    }
    //Determine whether there are contacts
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("Contact not found\n");
    }
    else
    {
        for (i = pos; i < pc->sz - 1; i++)
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
        printf("Contact deleted successfully\n");
    }
}


void Find(contact* pc)//find contact 
{
    char name[10];
    printf("Enter the name of the person you want to find>: \n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("There is no name in the address book");
    }
    else
    {
        printf("The person information found is:>");
        printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n ", "name", "Age", "Gender", "Telephone", "address");
        printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\t\n ",
        pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
    }
}


void Exchange(contact* pc)//Modify contact
{
    char name[10];
    printf("Enter the name of the person to modify>: \n");
    scanf("%s", name);
    int pos = SearchByName(pc, name);
    if (pos == -1)
    {
        printf("There is no modifier's name in the address book");
    }
    else
    {
        printf("Please enter your name>: ");
        scanf("%s", pc->data[pos].name);
        printf("Please enter age>: ");
        scanf("%d", &(pc->data[pos].age));
        printf("Please enter gender:>");
        scanf("%s", pc->data[pos].sex);
        printf("Please enter the phone number:>");
        scanf("%s", pc->data[pos].tele);
        printf("Please enter the address:>");
        scanf("%s", pc->data[pos].addr);
        printf("Modified successfully");
    }
}
void destroy(contact* pc)
{
    assert(pc);
    free(pc->data);
    pc->data = NULL;
    pc->capcity = 0;
    pc->sz = 0;
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("**********************************************\n");
	printf("*******     1.Add        2.Dele      *********\n");
	printf("*******     3.Find       4.Exchange **********\n");
	printf("*******     5.show       0.exit     **********\n");
	printf("**********************************************\n");
}
int main()
{
	int input = 0;
	contact con;
	Initcontact(&con);
	do
	{
		menu();
		printf("Please enter a number>: ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add(&con);
			break;
		case 2:
			Dele(&con);
			break;
		case 3:
			Find(&con);
			break;
		case 4:
			Exchange(&con);
			break;
		case 5:
			show(&con);
			break;
		case 0:
			destroy(&con);
			printf("Exit address book\n");
			break;
		default:
			printf("Selection error\n");
		}

	} while (input);
	return 0;
}

Welcome to like collection and pay more attention. If you have any questions, you can raise them 😁😁😁😁  

Keywords: C Back-end

Added by jkewlo on Sun, 13 Feb 2022 07:47:27 +0200