经过两周多的学习,把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;
}