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 😁😁😁😁