简易通讯录c语言链表,用c语言实现简易通讯录(链表)

首先,这是本人第一次写博客。不当之处,望请见谅!(脑补一个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");

}

结果显示:

ac045fef31967084fdee62e4f1a8d8da.png

完事收工!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值