初学不懂,请问这样子算是使用了链表吗
程序代码:
/* 以本班同学的具体数据为背景,设计一个本班同学通讯录 实现以下功能: 1) 通讯录编辑(添加、删除); 2) 按不同的项进行查找; 3) 对已存在的通讯录按不同的项排序; 4) 将通讯录写入文件; 5) 从文件读入通讯录。 备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define NAME_LEN 40 #define ADDRESS_LEN 60 #define TEL_LEN 12 #define E_LEN 30 #define MAX 1000 //*****************函数声明*******************// void menu(); void InitContact(struct Contact* ps); void Add(struct Contact* p); void Del(struct Contact* p); void Moidfy(struct Contact* p); void Search(struct Contact* p); void Sort(struct Contact* p); void Sort_by_name(struct Contact* p); void Sort_by_tele(struct Contact* p); int FindValue_1(struct Contact* p, char* name); int FindValue_2(struct Contact* p, char* name); void Show(struct Contact* p); void LoadContact(Contact* p); int SaveFILE(struct Contact* p); //*****************联系人信息*****************// struct people { char name[NAME_LEN]; //姓名 char address[ADDRESS_LEN]; //地址 char telephone_num[TEL_LEN]; //电话 int Postal; //邮编 char E_mail[E_LEN]; //E-mail }; //***************通讯录类型*****************// struct Contact { struct people data[MAX]; //存放1000个信息 int size; //记录当前结构体内已经有的元素个数 }; 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("** 0. exit **\n"); printf("---------------------------------\n"); } //***************初始化通讯录***************// void InitContact(struct Contact* ps) { memset(ps->data, 0, sizeof(ps->data)); ps->size = 0;//通讯录最初只有0个元素 } //**************添加联系人信息**************// void Add(struct Contact *p) { if (p->size >= MAX) printf("通讯录已满,无法增加\n"); else { printf("请输入姓名:>"); scanf("%s", p->data[p->size].name); printf("请输入住址:>"); scanf("%s", p->data[p->size].address); printf("请输入电话:>"); scanf_s("%s", p->data[p->size].telephone_num,12); printf("请输入邮编:>"); scanf("%d", &p->data[p->size].Postal); printf("请输入E-mail:>"); scanf("%s", p->data[p->size].E_mail); p->size++; printf("添加成功\n"); } } //**************删除联系人信息**************// void Del(struct Contact* p) { char name[NAME_LEN]; int temp = 0;//用来确认是否删除 int flag = 0; if (p->size <= 0) { printf("通讯录中没有联系人,请添加!\n"); } else { printf("查找姓名:"); scanf("%s", name); flag = FindValue_1(p, name); if (flag == -1) { printf("联系人不存在!\n"); } else { int i = 0; for ( i = flag; i < p->size - 1; i++) { p->data[i] = p->data[i + 1]; } p->size--; printf("删除成功!\n"); } } } //**************修改联系人信息**************// void Moidfy(struct Contact* p) { float get = 0; char name[NAME_LEN]; if (p->size <= 0) { printf("通讯录中没有联系人,请添加!\n"); } else { printf("查找姓名:"); scanf("%s", name); int flag = FindValue_1(p, name); if (flag == -1) printf("联系人不存在!\n"); else printf("输入0退出修改,否则继续:>"); scanf("%f", &get); if (get != 0) { printf("请输入姓名:>"); scanf("%s", p->data[flag].name); printf("请输入住址:>"); scanf("%s", p->data[flag].address); printf("请输入电话:>"); scanf_s("%s", p->data[flag].telephone_num,12); printf("请输入邮编:>"); scanf("%d", &p->data[flag].Postal); printf("请输入E-mail:>"); scanf("%s", p->data[flag].E_mail); printf("修改成功!"); } } } //**************查找联系人信息**************// void Search(struct Contact* p) { char name[NAME_LEN]; char telephone_num[TEL_LEN]; int select = 0; int flag = 0; printf("查找:\n\t 1.按姓名 2.按电话号码\n|>"); scanf("%d", &select); if (select == 1) { scanf("%s", name); flag = FindValue_1(p, name); } else if(select == 2) { scanf("%s", telephone_num); flag = FindValue_2(p, telephone_num); } else { printf("输入错误\n"); flag = -1; } if (flag == -1) { printf("联系人不存在!\n"); } else { printf("\t姓名:>"); printf("%s\n", p->data[flag].name); printf("\t住址:>"); printf("%s\n", p->data[flag].address); printf("\t电话:>"); printf("%s\n", p->data[flag].telephone_num); printf("\t邮编:>"); printf("%d\n", p->data[flag].Postal); printf("\tE-mail:>"); printf("%s\n", p->data[flag].E_mail); } } void Sort(struct Contact* p) { int select = 0; printf("\t0.退出 1.按姓名 2.按电话号码\n|>"); do { scanf("%d", &select); switch (select) { case 0: break; case 1: Sort_by_name(p); break; case 2: Sort_by_tele(p); break; default: printf("选择错误,请重新选择 ! \n"); break; } } while (select != 0); } //****************姓名排序并显示****************// void Sort_by_name(struct Contact *p) { if (p->size <= 0) { printf("通讯录中没有联系人,请添加!\n"); } else { int i, j; for (i = 0; i < p->size - 1; i++) { for (j = 0; j < p->size - i - 1; j++) { if (strcmp(p->data[j].name, (p->data[j + 1]).name) > 0) { struct people temp; temp = p->data[j]; p->data[j] = p->data[j + 1]; p->data[j + 1] = temp; } } } printf("排序成功!\n"); } } //****************电话排序并显示****************// void Sort_by_tele(struct Contact* p) { if (p->size <= 0) { printf("通讯录中没有联系人,请添加!\n"); } else { int i, j; for (i = 0; i < p->size - 1; i++) { for (j = 0; j < p->size - i - 1; j++) { if (strcmp(p->data[j].telephone_num, (p->data[j + 1]).telephone_num) > 0) { struct people temp; temp = p->data[j]; p->data[j] = p->data[j + 1]; p->data[j + 1] = temp; } } } printf("排序成功!\n"); } } //*****************按姓名查找****************// int FindValue_1(struct Contact* p, char* name) { int i = 0; for (i = 0; i < p->size; i++) { if (strcmp(p->data[i].name, name) == 0) return i; } return -1; } //*****************按电话号码查找****************// int FindValue_2(struct Contact* p, char* telephone_num) { int i = 0; for (i = 0; i < p->size; i++) { if (strcmp(p->data[i].telephone_num, telephone_num) == 0) return i; } return -1; } //***************显示通讯录*****************// void Show(struct Contact* p) { if (p->size <= 0) { printf("通讯录中没有联系人,请添加!\n"); } else { for (int i = 0; i < p->size; i++) { printf("%-10s%-10s%-10s%-10d%-10s\n ", p->data[i].name, p->data[i].address, p->data[i].telephone_num, p->data[i].Postal, p->data[i].E_mail); } } } //***************读取通讯录*****************// void LoadContact( struct Contact* p) { people tmp = { 0 };//临时变量tmp FILE* FR = fopen("contact.txt", "rb"); if (FR == NULL) { printf("LoadContact::%s\n", strerror(errno)); return; } //读取文件,存放到通讯录中 while (fread(&tmp, sizeof(people), 1, FR)) { p->data[p->size] = tmp; p->size++; } fclose(FR); FR = NULL; } //****************保存通讯录*****************// int SaveFILE(struct Contact *p) { FILE* fp = fopen("contact.txt", "w"); if (fp == NULL) { printf("SaveContact::%s\n", strerror(errno)); return -1; } //写通讯录中数据到为文件中 int i = 0; for (i = 0; i < p->size; i++) { fwrite(&(p->data[i]), sizeof(people), 1, fp); } printf("已保存联系人!\n"); fclose(fp); fp = NULL; return 0; } //***************主函数*****************// int main() { int input = 0; struct Contact con; //创建通讯录,里面包含1000个元素的数和size InitContact(&con); //初始化通讯录 LoadContact(&con); do { menu(); printf("请选择:>\n别输入字母哟!"); scanf("%d", &input); switch (input) { case 1: Add(&con); break; case 2: Del(&con); break; case 3: Search(&con); break; case 4: Moidfy(&con); break; case 5: Show(&con); break; case 6: Sort(&con); break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误\n"); break; } } while (input); SaveFILE(&con); return 0; }