该系统实现了电子通讯录的基本功能(新建联系人、查找联系人、修改联系人信息、删除联系人),这个代码是在基于C语言的学生成绩管理系统的基础上修改的,代码包含的知识比较综合,源代码是三个人合作完成的。
录入联系人的信息
void Creatlist(Nodelinklist **tx20,int n){
Nodelinklist *p=NULL,*pr=NULL;//p为当前节点,pr为尾结点
int j=0;
if(n==0){*tx20=NULL; printf("\n你创建了一个空表");return;}
(*tx20)=(Nodelinklist *)malloc(sizeof(Nodelinklist));
printf("\n第%d个编号:",j+1);scanf("%s",(*tx20)->Stu.no);getchar();//提示输入编号
printf("第%d个姓名:",j+1);gets((*tx20)->Stu.name);//提示输入姓名
printf("第%d个电子邮件:",j+1) ;gets((*tx20)->Stu.email);//提示输入电子邮件
printf("第%d个地址:",j+1) ;gets((*tx20)->Stu.add);//提示输入地址
printf("第%d个电话:",j+1);gets((*tx20)->Stu.phone);
(*tx20)->next=NULL;
pr=(*tx20);
*tx20=pr;
for(j=1;j<n;j++){
p=(Nodelinklist *)malloc(sizeof(Nodelinklist));
printf("\n第%d个编号;",j+1);scanf("%s",p->Stu.no);getchar();
printf("第%d个姓名:",j+1);gets(p->Stu.name);
printf("第%d个电子邮件:",j+1);gets(p->Stu.email);
printf("第%d个地址:",j+1) ;gets(p->Stu.add);
printf("第%d个电话:",j+1);gets(p->Stu.phone);
p->next=NULL;
pr->next=p;
pr=p;
}
}
通过姓名查找联系人新建联系人
int find(Nodelinklist **tx20,int n){
char A[100]={'\0'};
Nodelinklist *p=NULL;
int i=0;
if(*tx20==NULL){
printf("\n通讯录中没有联系人可删除!");
return 0;
}
printf("\n输入他的姓名:");
gets(A);
p=*tx20;
for(i=0;i<n;i++){
if(strcmp(A,p->Stu.name)!=0){
p=p->next;
}else{
break;
}
}
if(i==n){
printf("\n通讯录中找不到此联系人!");
return 0;
}
printf("\n你要找联系人信息:\n编号:%s,姓名:%s,电子邮件:%s,地址:%s,电话:%s\n",p->Stu.no,p->Stu.name,p->Stu.email,p->Stu.add,p->Stu.phone);
return 1;
}
新建联系人
void Insert_L_NH(Nodelinklist **tx20,int *n){
int i=0,j=0;
Nodelinklist *p=NULL,*pr=NULL;
printf("\n\n开始插入:\n");
printf("Please input i=:\n");
scanf("%d",&i);//输入要插入的位置
if(i<1){
printf("\n插入失败!");
return;
}
//先开辟结点
p=(Nodelinklist *)malloc(sizeof(Nodelinklist));
getchar();
printf("新联系人的的编号为:");
gets((p->Stu).no);
printf("新联系人的姓名为:");
gets((p->Stu).name);
printf("新联系人的电子邮件为:");
gets((p->Stu).email);
printf("新联系人的地址为:");
gets((p->Stu).add);
printf("新联系人的电话号码为:");
gets((p->Stu).phone);
p->next=NULL;
if(*tx20==NULL){//原表是一个空表,新插入的节点成为标中唯一的一个节点
*tx20=p;
printf("插入成功!\n");
(*n)++;
return;
}
if(*tx20!=NULL){//原表不为空
//特殊处理i=1
if(i==1){
p->next=*tx20;
*tx20=p;
printf("插入成功!\n");
(*n)++;
return;
}
//一般情况
if((i>1)&&(i<=*n)){
pr=*tx20;
for(j=2;j<=i-1;j++){
pr=pr->next;
}//先要进行遍历,定位到前一个节点
p->next=pr->next;
pr->next=p;
printf("插入成功!\n");
(*n)++;
return;
}
//插入越界
if(i>*n){
pr=*tx20;
i=*n;
for(j=1;j<=i-1;j++){
pr=pr->next;
}//先要进行遍历,定位到前一个节点
pr->next=p;
(*n)++;
return;
}
}
}
按编号查找联系人
int Find(Nodelinklist **tx20,char B[100],int n){
int i=0;
Nodelinklist *p=NULL;
p=*tx20;
for(;i<n;i++){
if(strcmp(B,p->Stu.name)!=0){
p=p->next;
}else{
break;
}
}
if(p==NULL){
return 0;
}else{
return i+1;
}
}
按姓名删除联系人
void Delet_L_NH(Nodelinklist **tx20,int *n){
Nodelinklist *p=NULL,*pr=NULL;
int i=0,j=0;
char thename[100]={'\0'};
printf("\n开始删除:\n");
//先判断链表是否为空
if(*tx20==NULL){
printf("The link is empty!");
return;
}
//输入要删除的姓名
printf("请输入你要删除的联系人的姓名:\n");
gets(thename);
p=*tx20;
//判断特殊情况,存不存在这个学生
if(Find(tx20,thename,*n)==0){
printf("\n查无此人!");
return;
}
//判断特殊情况,是不是第一个学生
if(Find(tx20,thename,*n)==1){
*tx20=p->next;
free(p);
printf("删除成功!\n");
(*n)--;
return;
}
//一般情况
if(Find(tx20,thename,*n)!=1&&Find(tx20,thename,*n)!=0){
for(i=2;i<=(Find(tx20,thename,*n)-1);i++){
p=p->next;
}//用查找函数可知道是第几个节点,再用循环定位到该节点的前一个地址
p->next=p->next->next;
printf("删除成功!\n");
(*n)--;
return;
}
}
按姓名的首字母将联系人排序(冒泡排序)
void PopSort(Nodelinklist **tx20,int n){
Nodelinklist *h=NULL,*f=NULL,*p=NULL;
int i=0,j=0;
Stu temp;
if(*tx20==NULL){
printf("\n空表,无值可输!");
return;
}
h=*tx20;
f=(*tx20)->next;
for(i=1;i<n;i++){
h=*tx20;
f=h->next;//交换会改变第一个节点
for(j=1;j<n-i+1;j++){
/*if((f->Stu.score)>(h->Stu.score)){
temp=f->Stu;
f->Stu=h->Stu;
h->Stu=temp;
}*/
if(strcmp(f->Stu.name,h->Stu.name)<0){
temp=f->Stu;
f->Stu=h->Stu;
h->Stu=temp;
}
h=h->next;
f=f->next;
}
}
p=*tx20;
for(i=1;p!=NULL;i++){
printf("\n第%d个联系人的的信息,编号:%s,姓名:%s,电子邮件:%s,地址:%s,联系电话:%s\n",i,p->Stu.no,p->Stu.name,p->Stu.email,p->Stu.add,p->Stu.phone);p=p->next;
}
}
修改联系人的信息
void ReviseChange(Nodelinklist **tx20,int n){
char A[10]={'\0'},B[12]={'\0'};
int j=0,i=0;
Nodelinklist *p=NULL;
printf("\n\n开始修改联系人的信息:");
if(*tx20==NULL){
printf("\n无法进行修改,这是一个空表!");
return;
}
printf("输入联系人的姓名");
gets(A);
for(i=0,p=*tx20;i<n;i++){
if(strcmp(A,p->Stu.name)!=0){
p=p->next;
}else{
break;
}
}
if(p==NULL){
printf("查无此人!");
return;
}
printf("该同学信息:\n编号:%s,姓名:%s,电子邮件:%s,地址:%s,电话号码:%s\n",p->Stu.no,p->Stu.name,p->Stu.email,p->Stu.add,p->Stu.phone);
printf("该联系人的电子邮件改为:");gets(p->Stu.email);
printf("该联系人的地址改为:") ;gets(p->Stu.add);
printf("该联系人的电话号码改为:");gets(p->Stu.phone);
}
代码的主要功能函数如上,读者如有更好地建议可以在评论区相互交流。