厚街做网站公司/搜索引擎优化工作
无界面的通讯录,能存储联系人姓名和号码,当然没有保存到文件,因为只是个数据结构的练手。用到了链表的一些操作,能按关键字(姓名和号码都可以)模糊查找,并且显示的时候是按查找的次数来显示,查找的字符串匹配算法用的是KMP算法,纯属杀鸡用牛刀,初始化的时候还用到了递归,三百多行代码。
/**
@lkxiaolou 通讯录
**/ #include<stdio.h>
#include<string.h>
#include<malloc.h>/**定义节点
**/
typedef struct p
{char *name; //姓名char *number; //号码int times; //搜索次数struct p *next;
}person,*lperson;//创建通讯录指针
lperson booklist=NULL;
//创建模糊查找链表指针
lperson bookselected=NULL;/*
** 函数声明
*/
lperson addperson(lperson book,char *name,char *number,int times); //插入节点
void view(lperson L); //遍历整个通讯录
lperson select(lperson book,char *key); //搜索符合条件的节点
int surtold(char *s,char *b); //关键字匹配的朴素算法
lperson change(lperson ced); //搜索后改变链表顺序
int init(); //初始化
int Index_KMP(char *s,char *p,int pos,int next[]); //关键字匹配的KMP算法
void Get_next(char *p,int next[]); //KMP算法的next函数
int surtnew(char *s,char *b); //关键字匹配的KMP算法
void deleteall(); //清空通讯录/**增加记录
**/
lperson addperson(lperson book,char *name,char *number,int times)
{//构造插入的节点 lperson s;s=(lperson)malloc(sizeof(person));s->name=(char*)malloc(sizeof(name));s->number=(char*)malloc(sizeof(number));s->times=(int)malloc(sizeof(int));s->times=times;strcpy(s->name,name);strcpy(s->number,number);s->next=NULL; if(book==NULL){book=s;s->next=NULL; return book;}else{lperson p=book;while(p->next!=NULL){p=p->next;}p->next=s;return book;}
} /**清空通讯录
**/
void deleteall()
{free(booklist);booklist=NULL;
}/**显示全部记录
**/
void view(lperson L)
{lperson p=L;printf("姓名\t号码\t\t搜索次数\n");while(p!=NULL){printf("%s\t%s\t%d\n",p->name,p->number,p->times);p=p->next;}
}/**模糊查找
**/
lperson select(lperson book,char *key)
{lperson p=book;while(p!=NULL){if(surtnew(p->name,key)||surtnew(p->number,key)){p->times++;bookselected=addperson(bookselected,p->name,p->number,p->times);booklist=change(p);}p=p->next;}return bookselected;
}/**KMP算法next函数
**/
void Get_next(char *p,int next[])
{ int i,j,slen; slen=strlen(p);i=0; next[0]=-1;j=-1; while(i<slen) { if(j==-1||p[i]==p[j]){++i;++j;next[i]=j;} else j=next[j]; }
}
/**KMP算法查找字符串
**/
int Index_KMP(char *s,char *p,int pos,int next[])
{ int i,j,slen,plen; i=pos-1; j=-1; slen=strlen(s); plen=strlen(p); while(i<slen&&j<plen) { if(j==-1||s[i]==p[j]){++i;++j;} else j=next[j]; } if(j>=plen) return 1; else return 0;
} /**朴素的字符串匹配
**/
int surtold(char *s,char *b)
{int i,j,lens,lenb,flag,itemp;lens=strlen(s);lenb=strlen(b);if(lens<lenb) return 0;else{for(i=0;i<=lens-lenb;i++){flag=0;for(j=0;j<lenb;j++){if(j==0) itemp=i;if(s[itemp]==b[j]) {flag++;itemp++;}else break;if(flag==lenb) return 1;}}return 0;}
}/**KMP算法的字符串匹配
**/
int surtnew(char *s,char *b)
{int next[1000];Get_next(b,next);return Index_KMP(s,b,0,next);
}/**重新按照搜索次数排列链表传入参数ced为待改变顺序节点
**/
lperson change(lperson ced)
{lperson head=booklist;lperson newlist=NULL;//ced的times最大if(ced->times>=head->times){newlist=addperson(newlist,ced->name,ced->number,ced->times);while(head!=NULL){if(head!=ced)newlist=addperson(newlist,head->name,head->number,head->times);head=head->next;}}//ced的times不是最大else{while(head->times>ced->times){if(head!=ced)newlist=addperson(newlist,head->name,head->number,head->times);head=head->next;}newlist=addperson(newlist,ced->name,ced->number,ced->times);while(head!=NULL){if(head!=ced)newlist=addperson(newlist,head->name,head->number,head->times);head=head->next;}}return newlist;
}//初始化界面
int init()
{
int f;
char newname[80];
char newnum[80];
char key[80];
printf("-------------通讯录---------------\n");
printf("请选择:\n");
printf("1.插入一条记录\n");
printf("2.查看所有记录\n");
printf("3.查找\n");
printf("4.清空通讯录\n");
printf("5.退出\n");scanf("%d",&f);
switch(f){case 1:printf("请输入姓名和电话号码(用空格隔开)\n");scanf("%s %s",newname,newnum);booklist=addperson(booklist,newname,newnum,0); getchar();init();break;case 2:view(booklist);getchar();init();break;case 3:printf("请输入关键字\n");scanf("%s",key);bookselected=select(booklist,key);if(bookselected==NULL){printf("未查找到相应记录!\n");}else{view(bookselected);} free(bookselected);bookselected=NULL;getchar();init();break;case 4:deleteall();getchar();init();break;case 5:break;default:printf("请正确输入\n");getchar();init();break;}
return 1;
}//入口主函数
int main()
{//测试数据booklist=addperson(booklist,"lk","18567106987",0);booklist=addperson(booklist,"yz","17659990000",0);booklist=addperson(booklist,"dk","18967106894",0);booklist=addperson(booklist,"xx","19879999922",0);init();return 1;
}