本程序使用单向循环列表,拥有基本功能
1.增加联系人,
2.删除联系人,
3.修改联系人信息,
4.显示所有联系人,
5.排序显示所有联系人 (堆排序法)
除了简单的功能外,还完善了许多的小bug,如
1.输入指令时如果输入字符个数多了或者不是想要的字符,会报相应错误,并要求重新输入
2.显示联系人时,只需要输入前几位信息就会显示所有符合的联系人,(如拥有联系人menglinggong,只需输入meng即可查找出)
3.添加联系人时,如果联系人已存在,会提示是否继续添加,若继续添加则自动生成后缀(_1,_2,_3.......)
4.修改联系人信息时,会要求输入指定选项以修改该联系人相应信息,然后提示是否继续修改该联系人信息,直至退出修改
本程序使用文件操作来保存联系人信息,并没用数据库
源码如下:
/*****************************************************
> File name:tongxunlu.c
> Author: Mr Meng
> 日期:2018-08-03 14:02
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define T 1
#define F 0
typedef char elementype;
typedef int status;
typedef struct tongxue
{
char name[20];
elementype xuehao[20];
elementype shoujihao[20];
elementype qqhao[20];
}link;
typedef struct node
{
struct node* next;
link data;
}*node;
//初始化以及输入
void gongneng(node head);
void zhiling(char* i);
status init(node* p);
void scan1(char* l);
void scan2(elementype* x);
void scan3(elementype* s);
void scan4(elementype* qq);
void tou();
//计算长度
int length(node p);
//添加联系人,当联系人已存在时提示是否继续添加,若继续添加则自动生成后缀
status insert_head(node p,char* l,elementype* x,elementype* s,elementype* qq);
//查找联系人,当联系人信息不完全记得时,只需输入前几位,系统会自动显示出所有符合条件的联系人
status query_name(node p,char* g);
//显示所有联系人
void print(node p);
//删除联系人,先调用查找联系人函数,再根据查找到的联系人信息指定删除某联系人
status delete_name(node p,char* z);
//更新联系人信息,先调用查找函数,在根据查找到的信息指定修改某联系人的信息,可单独修改指定信息,也可全部修改
status update_name(node p,char* z);
status update_no();
//用堆排序法排序显示
void heapadjust1(node* arr,int n,int m);
int heap(node p,char* z);
void heapadjust2(node* arr,int n,int m);
void heapadjust3(node* arr,int n,int m);
void heapadjust4(node* arr,int n,int m);
void swap(node* arr,int i,int j);
//文件操作实现通讯录的保存
void write(node p);
void read(node p);
int Insert_Last(node h,link data);
int main()
{
FILE* file = fopen("cmd.txt", "a+");
if(NULL == file)
{
perror("fopen");
return 1;
}
node head;
init(&head);
read(head);
system("clear");
tou();
gongneng(head);
write(head);
fclose(file);
return 0;
}
void gongneng(node head)
{
char i[10];
printf("请输入一位操作指令:");
zhiling(i);
getchar();
char l[20];
elementype x[20];
elementype s[20];
elementype qq[20];
char z[10];
while(i != 0)
{
switch(i[0])
{
case'1':scan1(l);//添加联系人
node newhead = head;
int ff = 0;
while(newhead != head->next)
{
if(strcmp(head->next->data.name , l) == 0)
{
ff++;
}
head = head->next;
}
if(ff != 0)
{
printf("联系人已存在是否继续添加,1.添加,0.取消\n");
printf("请输入:");
int kk;
scanf("%d",&kk);
head = newhead;
if(kk == 0)
{
int clear;
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
}
int tt = strlen(l);
static int mm = 48;
mm++;
l[tt] = '_';
l[tt+1] = mm;
l[tt+2] = '\0';
}
head = newhead;
scan2(x);
scan3(s);
scan4(qq);
insert_head(head,l,x,s,qq);
printf("添加成功\n");
int clear;
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'2':printf("1:按联系人姓名查找 2:按学号查找 3:按手机号查找 4:按QQ号查找\n");//查找联系人
printf("请输入操作编号:");
zhiling(z);
query_name(head,z);
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'3':print(head);//显示所有联系人
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'4':printf("1:按联系人姓名删除 2:按学号删除 3:按手机号删除 4:按QQ号删除\n");//删除联系人
int re;
int rp;
printf("请输入操作编号:");
zhiling(z);
rp = query_name(head,z);
if(rp != 0)
{
printf("请输入1.删除,0.不删除\n");
printf("请输入:");
scanf("%d",&re);
if (re == 1)
{
delete_name(head,z);
}
}
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'5':printf("1:按联系人姓名更新 2:按学号更新 3:按手机号更新 4:按QQ号更新\n");//更新联系人
printf("请输入操作编号:");
zhiling(z);
rp = query_name(head,z);
if(rp != 0)
{
printf("请输入1.更新,0.不更新\n");
printf("请输入:");
scanf("%d",&re);
if(re == 1)
{
update_name(head,z);
}
}
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'6':printf("1:按联系人姓名排序 2:按学号排序 3:按手机号排序 4:按QQ号排序\n");
printf("请输入操作编号:");
zhiling(z);
heap(head,z);
printf("输入任意数字继续:");
scanf("%d",&clear);
system("clear");
tou();
break;
case'7':return;
default:printf("输入错误\n");
break;
}
printf("请输入一位操作指令:");
zhiling(i);
getchar();
}
}
void tou()
{
printf("*******************************欢迎进入164班通讯录**************************************\n");
printf("* *\n");
printf("* 1:添加联系人 2:查找联系人 *\n");
printf("* *\n");
printf("* 3:显示所有联系人 4:删除联系人 *\n");
printf("* *\n");
printf("* 5:修改联系人信息 6:排序显示 *\n");
printf("* *\n");
printf("* 7:退出 *\n");
printf("* *\n");
printf("****************************************************************************************\n");
}
void zhiling(char* i)
{
scanf("%s",i);
int pp = 0;
while(i[pp] != '\0')
{
pp++;
}
if(pp > 1)
{
printf("指令过长,请重新输入一位指令:");
zhiling(i);
}
}
status init(node* p)
{
node newnode = (node)malloc(sizeof(struct node));
if(NULL == newnode)
{
return F;
}
newnode->next = newnode;
*p = newnode;
return T;
}
void print(node p)
{
node head = p;
while(head != p->next->next)
{
printf("联系人:%-15s\t",p->next->data.name);
printf("学号 :%-15s\t",p->next->data.xuehao);
printf("手机号:%-15s\t",p->next->data.shoujihao);
printf("qq号 :%-15s\n",p->next->data.qqhao);
printf("\n");
p = p->next;
}
}
int length(node p)
{
int i = 0;
node head = p;
while(head != p->next)
{
i++;
p = p->next;
}
return i;
}
status insert_head(node p,char* l,elementype* x,elementype* s,elementype* qq)
{
node newnode = (node)malloc(sizeof(struct node));
if(NULL == newnode)
{
return F;
}
strcpy(newnode->data.name,l);
strcpy(newnode->data.xuehao , x);
strcpy(newnode->data.shoujihao,s);
strcpy(newnode->data.qqhao,qq);
newnode->next = p->next;
p->next = newnode;
return T;
}
void scan1(char* l)
{
printf("请输入联系人姓名:");
scanf("%s",l);
}
void scan2(elementype* x)
{
printf("请输入学号(无空格):");
scanf("%s",x);
int i = 0;
while(x[i] != '\0')
{
i++;
}
int n;
for(n = 0;n < i;n++)
{
if(x[n] > 57 || x[n] < 48)
{
printf("输入有非数字字符,请重新输入\n");
scan2(x);
break;
}
}
}
void scan3(elementype* s)
{
printf("请输入手机号(无空格):");
scanf("%s",s);
int i = 0;
while(s[i] != '\0')
{
i++;
}
int n;
for(n = 0;n < i;n++)
{
if(s[n] > 57 || s[n] < 48)
{
printf("输入有非数字字符,请重新输入\n");
scan3(s);
break;
}
}
}
void scan4(elementype* qq)
{
printf("请输入qq号(无空格):");
scanf("%s",qq);
int i = 0;
while(qq[i] != '\0')
{
i++;
}
int n;
for(n = 0;n < i;n++)
{
if(qq[n] > 57 || qq[n] < 48)
{
printf("输入有非数字字符,请重新输入\n");
scan4(qq);
break;
}
}
}
status query_name(node p,char* g)//显示所有符合条件的联系人
{
node head = p;
char l[20];
elementype s[20];
int i = 0;
while(g != 0)
{
switch(g[0])
{
case'1':scan1(l);
int zzz = strlen(l);
//printf("zzz = %d \n",zzz);
char* buf;
while(head != p->next)
{
strncpy(buf,p->next->data.name,zzz);
buf[zzz] = '\0';
//printf("buf = %s\n",buf);
if(strcmp(buf ,l) == 0)
{
printf("联系人:%-15s\t",p->next->data.name);
printf("学号 :%-15s\t",p->next->data.xuehao);
printf("手机号:%-15s\t",p->next->data.shoujihao);
printf("qq号 :%-15s\n",p->next->data.qqhao);
i++;
}
p = p->next;
}
if(i == 0)
{
printf("没有找到满足条件的联系人\n");
return F;
}
printf("满足条件的联系人有 %d 位\n",i);
return T;
case'2':scan2(s);
zzz = strlen(s);
while(head != p->next)
{
strncpy(buf,p->next->data.xuehao,zzz);
buf[zzz] = '\0';
if(strcmp(buf,s) == 0)
{
printf("联系人:%-15s\t",p->next->data.name);
printf("学号 :%-15s\t",p->next->data.xuehao);
printf("手机号:%-15s\t",p->next->data.shoujihao);
printf("qq号 :%-15s\n",p->next->data.qqhao);
i++;
}
p = p->next;
}
if(i == 0)
{
printf("没有找到满足条件的联系人\n");
return F;
}
printf("满足条件的联系人有 %d 位\n",i);
return T;
case'3':scan3(s);
zzz = strlen(s);
while(head != p->next)
{
strncpy(buf,p->next->data.shoujihao,zzz);
buf[zzz] = '\0';
if(strcmp(buf,s) == 0)
{
printf("联系人:%-15s\t",p->next->data.name);
printf("学号 :%-15s\t",p->next->data.xuehao);
printf("手机号:%-15s\t",p->next->data.shoujihao);
printf("qq号 :%-15s\n",p->next->data.qqhao);
i++;
}
p = p->next;
}
if(i == 0)
{
printf("没有找到满足条件的联系人\n");
return F;
}
printf("满足条件的联系人有 %d 位\n",i);
return T;
case'4':scan4(s);
zzz = strlen(s);
while(head != p->next)
{
strncpy(buf,p->next->data.qqhao,zzz);
buf[zzz] = '\0';
if(strcmp(buf,s) == 0)
{
printf("联系人:%-15s\t",p->next->data.name);
printf("学号 :%-15s\t",p->next->data.xuehao);
printf("手机号:%-15s\t",p->next->data.shoujihao);
printf("qq号 :%-15s\n",p->next->data.qqhao);
i++;
}
p = p->next;
}
if(i == 0)
{
printf("没有找到满足条件的联系人\n");
return F;
}
printf("满足条件的联系人有 %d 位\n",i);
return T;
default:printf("输入错误");
break;
}
printf("请重新输入操作指令:");
zhiling(g);
}
}
status delete_name(node p,char* z)
{
if(p != NULL)
{
char l[20];
elementype s[20];
node head = p;
while(z !=0)
{
switch(z[0])
{
case'1':printf("请输入需要删除的联系人的姓名:");
scanf("%s",l);
int a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.name ,l) == 0)
{
node temp = p->next;
p->next = temp->next;
free(temp);
a++;
}
else
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
else
printf("删除成功\n");
return T;
case'2':printf("请输入需要删除的联系人的学号:");
scanf("%s",s);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.xuehao ,s) == 0)
{
node temp = p->next;
p->next = temp->next;
free(temp);
a++;
}
else
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
case'3':printf("请输入需要珊除的联系人的手机号:");
scanf("%s",s);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.shoujihao ,s) == 0)
{
node temp = p->next;
p->next = temp->next;
free(temp);
a++;
}
else
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
case'4':printf("请输入需要删除的联系人的qq号:");
scanf("%s",s);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.qqhao,s) == 0)
{
node temp = p->next;
p->next = temp->next;
free(temp);
a++;
}
else
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
default:printf("输入错误请重新输入\n");
break;
}
zhiling(z);
}
}
}
status update_name(node p,char* z)
{
if(NULL != p)
{
node head = p;
char l[20];
elementype mm[20];
z[0] = '1';
while(z != 0)
{
switch(z[0])
{
case'1':printf("请输入需要修改的联系人的姓名:");
scanf("%s",l);
int a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.name ,l) == 0)
{
char* pp;
printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
printf("请输入操作编号:");
zhiling(pp);
update_no(p,pp);
a++;
}
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
case'2':printf("请输入需要修改的联系人的学号:");
scanf("%s",&mm);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.xuehao ,mm) == 0)
{
char* pp;
printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
printf("请输入操作编号:");
zhiling(pp);
update_no(p,pp);
a++;
}
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
case'3':printf("请输入需要修改的联系人的手机号:");
scanf("%s",&mm);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.shoujihao ,mm) == 0)
{
char* pp;
printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
printf("请输入操作编号:");
zhiling(pp);
update_no(p,pp);
a++;
}
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
case'4':printf("请输入需要修改的联系人的qq号:");
scanf("%s",&mm);
a = 0;
while(head != p->next)
{
if(strcmp(p->next->data.qqhao ,mm) == 0)
{
char* pp;
printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
printf("请输入操作编号:");
zhiling(pp);
update_no(p,pp);
a++;
}
p = p->next;
}
if(a == 0)
{
printf("没有找到满足条件的联系人\n");
}
return T;
default:printf("输入错误请重新输入\n");
break;
}
zhiling(z);
}
}
}
status update_no(node p,char* pp)
{
char l[20];
elementype x[20];
elementype s[20];
elementype qq[20];
while(pp != 0)
{
switch(pp[0])
{
case'1':scan1(l);
strcpy(p->next->data.name,l);
break;
case'2':scan2(x);
strcpy(p->next->data.xuehao,x);
break;
case'3':scan3(s);
strcpy(p->next->data.shoujihao,s);
break;
case'4':scan4(qq);
strcpy(p->next->data.qqhao,qq);
break;
default:printf("输入错误修改未成功\n");
break;
}
printf("是否继续修改,1.修改,0.不修改\n");
printf("请输入:");
int gg;
scanf("%d",&gg);
if(gg == 1)
{
printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
printf("请输入操作编号:");
zhiling(pp);
}
else
return T;
}
}
int heap(node p,char* z)
{
int len = length(p);
node arr[len];
int i;
for(i = 0;i < len;i++)
{
arr[i] = p->next;
p = p->next;
}
while(z != 0)
{
switch(z[0])
{
case'1':for(i = (len-3)/2;i >= 0;i--)
heapadjust1(arr,i,len-2);
for(i = len-2;i >= 0;i--)
{
swap(arr,0,i);
heapadjust1(arr,0,i-1);
printf("联系人:%-15s\t",arr[i]->data.name);
printf("学号 :%-15s\t",arr[i]->data.xuehao);
printf("手机号:%-15s\t",arr[i]->data.shoujihao);
printf("qq号 :%-15s\n",arr[i]->data.qqhao);
printf("\n");
}
return T;
case'2':for(i = (len-3)/2;i >= 0;i--)
heapadjust2(arr,i,len-2);
for(i = len-2;i >= 0;i--)
{
swap(arr,0,i);
heapadjust2(arr,0,i-1);
printf("学号 :%-15s\t",arr[i]->data.xuehao);
printf("联系人:%-15s\t",arr[i]->data.name);
printf("手机号:%-15s\t",arr[i]->data.shoujihao);
printf("qq号 :%-15s\n",arr[i]->data.qqhao);
printf("\n");
}
return T;
case'3':for(i = (len-3)/2;i >= 0;i--)
heapadjust3(arr,i,len-2);
for(i = len-2;i >= 0;i--)
{
swap(arr,0,i);
heapadjust3(arr,0,i-1);
printf("手机号:%-15s\t",arr[i]->data.shoujihao);
printf("联系人:%-15s\t",arr[i]->data.name);
printf("学号 :%-15s\t",arr[i]->data.xuehao);
printf("qq号 :%-15s\n",arr[i]->data.qqhao);
printf("\n");
}
return T;
case'4':for(i = (len-3)/2;i >= 0;i--)
heapadjust4(arr,i,len-2);
for(i = len-2;i >= 0;i--)
{
swap(arr,0,i);
heapadjust4(arr,0,i-1);
printf("qq号 :%-15s\t",arr[i]->data.qqhao);
printf("联系人:%-15s\t",arr[i]->data.name);
printf("学号 :%-15s\t",arr[i]->data.xuehao);
printf("手机号:%-15s\n",arr[i]->data.shoujihao);
printf("\n");
}
return T;
default:printf("输入错误请重新输入:");
break;
}
zhiling(z);
}
}
void swap(node* arr,int i,int j)
{
node temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void heapadjust1(node* arr,int n,int m)
{
node temp = arr[n];
int i;
for(i = 2*n+1;i <= m;i = 2*i+1)
{
if(i < m && arr[i]->data.name[0] > arr[i+1]->data.name[0])
i++;
if(arr[i]->data.name[0] > temp->data.name[0])
{
break;
}
arr[n] = arr[i];
n = i;
}
arr[n] = temp;
}
void heapadjust2(node* arr,int n,int m)
{
node temp = arr[n];
int i;
for(i = 2*n+1;i <= m;i = 2*i+1)
{
if(i < m && arr[i]->data.xuehao[0] > arr[i+1]->data.xuehao[0])
i++;
if(arr[i]->data.xuehao[0] > temp->data.xuehao[0])
{
break;
}
arr[n] = arr[i];
n = i;
}
arr[n] = temp;
}
void heapadjust3(node* arr,int n,int m)
{
node temp = arr[n];
int i;
for(i = 2*n+1;i <= m;i = 2*i+1)
{
if(i < m && arr[i]->data.shoujihao[0] > arr[i+1]->data.shoujihao[0])
i++;
if(arr[i]->data.shoujihao[0] > temp->data.shoujihao[0])
{
break;
}
arr[n] = arr[i];
n = i;
}
arr[n] = temp;
}
void heapadjust4(node* arr,int n,int m)
{
node temp = arr[n];
int i;
for(i = 2*n+1;i <= m;i = 2*i+1)
{
if(i < m && arr[i]->data.qqhao[0] > arr[i+1]->data.qqhao[0])
i++;
if(arr[i]->data.qqhao[0] > temp->data.qqhao[0])
{
break;
}
arr[n] = arr[i];
n = i;
}
arr[n] = temp;
}
void write(node p)
{
FILE* file = fopen("cmd.txt", "w+");
if(NULL == file)
{
perror("fopen");
return;
}
node head = p;
fseek(file,0,0);
while(p->next != head)
{
fprintf(file, "%-15s\t", p->next->data.name);
fprintf(file, "%-15s\t", p->next->data.xuehao);
fprintf(file, "%-15s\t", p->next->data.shoujihao);
fprintf(file, "%-15s\r\n", p->next->data.qqhao);
p = p->next;
}
fclose(file);
}
void read(node p)
{
FILE* file = fopen("cmd.txt", "r");
if(NULL == file)
{
perror("fopen");
return;
}
fseek(file,0,0);
node head = p;
while(!feof(file))
{
node newnode = (node)malloc(sizeof(struct node));
p->next = newnode;
newnode->next = head;
fscanf(file, "%s", p->next->data.name);
fscanf(file, "%s", p->next->data.xuehao);
fscanf(file, "%s", p->next->data.shoujihao);
fscanf(file, "%s", p->next->data.qqhao);
p = p->next;
}
fclose(file);
}