经过两周多的学习,把C语言的基本语法以及数据结构的链表部分复习了一遍,下面利用单链表实现一个通讯录的管理系统,里面涉及链表元素的插入(头插法、尾插法)、删除、查询、修改、打印这几个基础部分。
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct address { char name[10]; long num; struct address* next; }addr; void add_new(addr **list); void find_someone(addr* list); void del_someone(addr** list); void modify_someone(addr** list); void show(addr* list); void free_all(addr** list); void show(addr* list) { addr* L2; int count = 1; L2 = list; while (L2 != NULL) { printf("-----%d------\n", count); printf("%s: %u\n", L2->name, L2->num); L2 = L2->next; count++; } if (L2 = NULL) { printf("EMPTY!!!"); } } void add_new(addr** list) { addr *new; static addr *tail;//尾指针要定义成静态变量 new = (addr*)malloc(sizeof(addr)); printf("输入添加联系人的name:\n"); scanf_s("%s", new->name, sizeof(new->name)); printf("输入添加联系人的num:\n"); scanf_s("%d", &(new->num)); if ((*list) == NULL) { (*list) = new; new->next = NULL; } else { tail->next = new; new->next = NULL; } tail = new; show(*list); } void find_someone(addr *list) { addr *target,*temp; target = (addr*)malloc(sizeof(addr)); printf("输入查询联系人的name:\n"); scanf_s("%s", target->name, sizeof(target->name)); temp = list; while (temp != NULL) { if (!(strcmp(temp->name, target->name))) { printf("%s: %u\n", temp->name, temp->num); break; } else if((temp->next == NULL) && (strcmp(temp->name, target->name))) { printf("未查询到结果!\n"); break; } temp = temp->next; } } void del_someone(addr** list) { addr* old,*later,*temp,*previous; printf("输入你要删除的通讯name:\n"); old = (addr*)malloc(sizeof(addr)); scanf_s("%s",old->name,sizeof(old->name)); previous = NULL; temp = *list; later = temp->next; while (temp != NULL) { if (!(strcmp(temp->name, old->name))) { if (previous != NULL) { later = temp->next; previous->next = later; temp = later; } else { *list = temp->next; } break; } else if (strcmp(temp->name, old->name)) { previous = temp; temp = temp->next; later = temp->next; continue; } else if ((temp->next == NULL) && (strcmp(temp->name, old->name))) { printf("未查询到结果!\n"); break; } } show(*list); } void modify_someone(addr** list) { addr* target, * temp; target = (addr*)malloc(sizeof(addr)); printf("输入修改的联系人的name:\n"); scanf_s("%s", target->name, sizeof(target->name)); temp = *list; while (temp != NULL) { if (!(strcmp(temp->name, target->name))) { printf("OK!!!\n"); printf("输入修改联系人的新name:\n"); scanf_s("%s", temp->name, sizeof(temp->name)); printf("输入修改联系人的新num:\n"); scanf_s("%d", &(temp->num)); break; } else if ((temp->next == NULL) && (strcmp(temp->name, target->name))) { printf("未查询到结果!\n"); break; } temp = temp->next; } show(*list); } void free_all(addr** list) { addr* temp1,*temp2; temp1 = (*list)->next; while (temp1) { temp2 = temp1->next; free(temp1); temp1 = temp2; } } int main() { printf("1.插入新的联系人。\n"); printf("2.查找已有联系人。\n"); printf("3.删除已有联系人。\n"); printf("4.修改已有联系人。\n"); printf("-1.退出程序。\n"); printf("请输入要进行的操作编号:\n"); int input; addr *list; list = (addr*)malloc(sizeof(addr));//分配内存 list = NULL; while (scanf_s("%d", &input) != EOF) { switch (input) { case 1: add_new(&list); break; case 2: find_someone(list); break; case 3: del_someone(&list); break; case 4: modify_someone(&list); break; } if (input == -1) { free_all(&list); break; } printf("请输入要进行的操作编号:\n"); } printf("程序退出,欢迎下次使用!"); return 0; }