首先,这是本人第一次写博客。不当之处,望请见谅!(脑补一个doge)
最近在学习C语言,并实现了 下面链接中 简易通讯录的功能。区别是:我是用链表实现了其所有功能。并增加了文件保存模块!
本人初来乍到,c功底不是很扎实,且是第一次用c写小项目,虽然实现了所有功能,但代码中定会有很多需优化的地方。所以,各位希望不吝赐教!万分感谢!
https://blog.csdn.net/iconm/article/details/80380406
下面开始啦:
头文件:
# ifndef __TONGXUNLU_H
# define __TONGXUNLU_H
#include
#include
#include
#define LEN sizeof(address_list) //开辟空间
int n=0;//记录通讯录人员人数
typedef struct A
{
char name[100];//名字
char sex[5];//性别
char age[10];//年纪
char phone[15];//电话
char addr[100];//地址
struct A *next;
}address_list;
void show_feature(void);//菜单函数
address_list * add(address_list *);//添加联系人
address_list * delete1(address_list *);//删除特定联系人
void show_list(address_list *);//显示所有联系人
void find_list(address_list *);//寻找特定联系人
address_list * sort(address_list *);//排序联系人
address_list * clear_list(address_list *);//清楚所有联系人
address_list * revision_list(address_list *);//修改特定联系人特定信息
void save_list(address_list *);//保存所有联系人信息
void exit_list();//退出通讯录系统
# endif // __TONGXUNLU_H
主功能源码:
#include "tongxunlu.h"
int main()
{
int func;
address_list *p1;
p1 = (address_list *)malloc(LEN);
//printf("%d",p1->next);
do
{
show_feature();//菜单函数
printf("请选择您要进行的操作:");
scanf("%d" ,&func);
fflush(stdin);
switch(func)
{
case 1: p1=add(p1); break;//添加
case 2: p1=delete1(p1); break;//删除
case 3: find_list(p1); break;//查找
case 4: revision_list(p1); break;//修改
case 5: show_list(p1); break;//显示
case 6: p1=clear_list(p1); break;//清除
case 7: p1=sort(p1); break;//排序
case 8: save_list(p1); break;//保存
case 0: exit_list(); break;//退出
default: printf("选择错误,请重新输入!\n"); break;
}
}while(func);
return 0 ;
}
//修改特定联系人特定信息
address_list * revision_list(address_list *head)
{
char j[100],q[100],p[100];
address_list *A1;
A1 = (address_list *)malloc(LEN);
printf("请输入你想要修改的人的姓名:");
scanf("%s",j);
A1 = head;
for (int i=1; i <= n; i++)
{
if(!(strcmp(j,A1->name)))
{
printf("成功找到 %s 的具体信息:\n", A1->name);
printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name,A1->sex,A1->age,A1->phone,A1->addr);
printf("你想要修改%s的什么信息(name, sex, age, phone, addr):",j);
scanf("%s",q);
if((strcmp(q,"name"))&(strcmp(q,"sex"))&(strcmp(q,"age"))&(strcmp(q,"phone"))&(strcmp(q,"addr")))
{printf("请输入正确的想要修改的信息!\n");break;}
printf("你想要把 %s 的 %s 修改成:",j,q);
scanf("%s",p);
if(!(strcmp(q,"name")))strcpy(A1->name, p);
if(!(strcmp(q,"sex")))strcpy(A1->sex, p);
if(!(strcmp(q,"age")))strcpy(A1->age, p);
if(!(strcmp(q,"phone")))strcpy(A1->phone, p);
if(!(strcmp(q,"addr")))strcpy(A1->addr, p);
//A1->name = "x";这样赋值是不行滴!!
printf("成功把 %s 的 %s 修改为 %s!!!\n", j,q,p);break;
}
else
{
if(A1->next == NULL) printf("没有找到%s的信息!\n",j);
A1 = A1->next;
}
}
return head;
}
//清除联系人信息
address_list * clear_list(address_list *head)
{
head = NULL;
n = 0;
printf("已清除全部通讯录信息!!\n");
return head;
}
//寻找特定联系人信息
void find_list(address_list *head)
{
char j[100];
address_list *A1;
A1 = (address_list *)malloc(LEN);
printf("请输入你要查找人的姓名:");
scanf("%s",j);
A1 = head;
for (int i=1; i <= n; i++)
{
if(!(strcmp(j,A1->name)))
{
printf("%s 的具体信息是:\n", A1->name);
printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
break;
}
else
{
if(A1->next == NULL) printf("没有找到%s的信息\n",j);
A1 = A1->next;
}
}
//free(A1);
}
//删除某通讯录成员信息
address_list * delete1(address_list *head1)
{
char j[100];
int i;
address_list *p1,*p2,*p3,*p4;
p1=p2=p3=p4=(address_list *)malloc(LEN);
if (n == 0)
{
printf("There is no any data!");
goto END;
}
else
{
p1=p2=head1;
p4=head1->next;//p4的作用:当删除的是链表第一个数据时候。
printf("Please enter the name that you want to delete:");
scanf("%s",j);
//遍历链表,寻找要删除的数据
if(!(strcmp(j,head1->name)))//删除数据是否为第一个链表
{
if(n==1)
{
head1 = NULL;
printf("删除成功!\n");
printf("现在通讯表没有任何信息,请添加或退出!\n");
}
else
{
head1=p4;
printf("删除成功!");
}
}
//遍历链表寻找要删除的信息(若p3在第一链,则p2在第二链,p1在第三链)
for (i=1;i<=n;i++)
{
p1=p1->next;
if(!(strcmp(j,p2->name)))
{
p3->next=p2->next;
printf("删除成功!");
n--;
goto END;
}
else
{
p3=p2;
p2=p1;
}
}
}
printf("遍历通讯录,并未发现想要删除的信息!");
END:return head1;
}
//按首字母从小到大排序联系人信息
address_list * sort(address_list *head)
{
if(n == 0)
{
printf("没有数据,请添加!\n");
return head;
}
else//能进入下面程序的,n>=2
{
char j[100];
address_list *A1, *A2, *A3;
A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
printf("请选择要排序的方式");
printf("(name, sex, age, phone, addr):");
scanf("%s" ,j);
if((strcmp(j,"name"))&(strcmp(j,"sex"))&(strcmp(j,"age"))&(strcmp(j,"phone"))&(strcmp(j,"addr")))
{printf("输入有误!请输入正确的想要修改的信息!\n");goto END;}
//A1 = A2 = A3 = head;
if(head->next == NULL)//检测是否只有一组数据
{
printf("成功完成排序!\n");
//show_list(head);
return head;
}
else
{
for (int ii=1; ii<=n-1; ii++)
{
A1 = head->next;
A2 = head;
for (int jj=1; jj<=n-ii; jj++)
{
if(jj == 2) {A3 = head;}
if(jj > 2) {A3 = A3->next;}
if(!(strcmp(j,"name"))) {if(strcmp(A2->name,A1->name)>0) goto Loop; else goto Loop1;}
if(!(strcmp(j,"sex"))) {if(strcmp(A2->sex,A1->sex)>0) goto Loop; else goto Loop1;}
if(!(strcmp(j,"age"))) {if(strcmp(A2->age,A1->age)>0) goto Loop; else goto Loop1;}
if(!(strcmp(j,"phone"))) {if(strcmp(A2->phone,A1->phone)>0) goto Loop; else goto Loop1;}
if(!(strcmp(j,"addr"))) {if(strcmp(A2->addr,A1->addr)>0) goto Loop; else goto Loop1;}
Loop:{
if(jj == 1) {head = head->next;}
if(jj >= 2) {A3->next = A1;}
A2->next = A1->next;
A1->next = A2;
A1 = A1->next->next;
continue;
}
Loop1:{
A2 = A1;
A1 = A1->next;
}
}
//show_list(head);
}
printf("成功完成排序!\n");
}
END:return head;
}
}
//添加通讯录成员信息
address_list * add(address_list *head)
{
int i;
address_list *A1, *A2, *A3;
A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
A1 = head;
if(n==0)
{
printf("添加通讯录成员\n");
printf("请输入名字:");
scanf("%s",A2->name);
printf("请输入性别:");
scanf("%s",A2->sex);
printf("请输入年龄:");
scanf("%s",A2->age);
printf("请输入电话:");
scanf("%s",A2->phone);
printf("请输入地址:");
scanf("%s",A2->addr);
printf("添加成功!\n");
A2->next = NULL;
head = A2;
}
else
{
for (i=1; i<=n; i++)
{
if(A1->next == NULL)
{
A1->next = A3;
printf("\n添加通讯录成员\n");
printf("请输入名字:");
scanf("%s",A3->name);
printf("请输入性别:");
scanf("%s",A3->sex);
printf("请输入年龄:");
scanf("%s",A3->age);
printf("请输入电话:");
scanf("%s",A3->phone);
printf("请输入地址:");
scanf("%s",A3->addr);
printf("添加成功!\n");
A3->next = NULL;
}
A1 = A1->next;
}
}
n++;
//free(A1);free(A2);free(A3);//释放之后结果就不对了!
//printf("%d",head->next);
return head;
}
//显示已存在通讯表信息
void show_list(address_list *head)
{
int i;
address_list *A1;
A1 = (address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
A1 = head;
if (n == 0)
printf("没有数据,请添加!\n");
else
{
printf("\n现在通讯录中保存 %d 个人的信息!\n",n);
for (i=1; i<=n; i++)
{
printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
A1 = A1->next;
}
}
free(A1);
}
//保存联系人信息
void save_list(address_list *head)
{
address_list *A1;
A1 = (address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
A1 = head;
FILE *fp;//文件指针
/*文件的打开*/
char data_list[100];
printf("请输入想保存的文件名称(需带文件后缀):");
scanf("%s",data_list);
fp=fopen(data_list,"w");//fopen打开文件,这个文件可以是当前不存在的。“w”以写入的形式打开,“r”以读的形式打开
if(fp==NULL) //判断如果文件指针为空
{
printf("不能打开文件! " );
//exit(0);//在以0的形式退出,必须在文件开头有#include ,stdlib 头文件即standard library标准库头文件
}
//写入数据
else
{
for (int i=1; i<=n; i++)
{
fprintf(fp, "名字:%6s,性别:%6s,年龄:%6s,电话:%6s,地址:%6s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
A1 = A1->next;
}
printf("通讯录信息成功保存至 %s 中!\n",data_list);
}
//关闭文件
fclose(fp);
free(A1);
}
//显示功能
void show_feature(void)
{
printf("\n现在通讯录中保存 %d 个人的信息!\n",n);
printf("*********************************\n");
printf("***1. 添加 2. 删除********\n");
printf("***3. 查找 4. 修改********\n");
printf("***5. 显示 6. 清空********\n");
printf("***7. 排序 8. 保存********\n");
printf("***0. 退出 ********\n");
printf("*********************************\n");
}
//退出通讯录系统
void exit_list()
{
printf("欢迎您再次使用!");
printf("\n已成功退出通讯录系统!\n");
}
完事收工!