#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 50
typedef struct { //定义结构体
char name[20];
char address[20];
char tel[12];
char ZipCode[8];
char Email[32];
}Node;
typedef struct { //静态链表
Node *elem;
int length;
int listsize;
}Sqlist;
void InitSqlist(Sqlist *L){ //初始化
L->elem=(Node *)malloc(MaxSize*sizeof(Node));
if(!L->elem) exit(0);
L->length=0;
L->listsize=MaxSize;
}
void Insert(Sqlist *L){ //添加成员
Node *base;
int n;
n=L->length;
if(L->length>=L->listsize) {
base=(Node *)realloc(L->elem,(L->listsize+10)*sizeof(Node));
L->elem=base;
(L->listsize)+=10;
}
printf("please input %dth data: ",n+1);
printf("\n name : ");scanf("%s",L->elem[n].name);
printf("\n address: ");scanf("%s",L->elem[n].address);
printf("\n tel : ");scanf("%s",L->elem[n].tel);
printf("\n ZipCode: ");scanf("%s",L->elem[n].ZipCode);
printf("\n Email : ");scanf("%s",L->elem[n].Email);
printf("\n");
L->length++;
}
void print(Sqlist *L,int n) //输出单个成员信息
{
printf("第%d个联系人资料:\n名字:",n+1);
puts(L->elem[n].name);
printf("\n地址:");
puts(L->elem[n].address);
printf("\n电话:");
puts(L->elem[n].tel);
printf("\n邮编:");
puts(L->elem[n].ZipCode);
printf("\n邮箱:");
puts(L->elem[n].Email);
printf("\n");
}
int xunzhao(Sqlist *L) //根据姓名查找成员的排序号
{
char q[20];
int i,n;
printf("输入姓名:");
scanf("%s",q);
for(i=0;i<L->length;i++)
{
n=0;
while(L->elem[i].name[n]==q[n])
{
n++;
if(n==strlen(q))
{
return i;
}
}
}
}
void Display(Sqlist *L) //输出所有成员信息
{
int n=0;
while(n<L->length)
{
print(L,n);
n++;
printf("\n");
}
}
void Delete(Sqlist *L)//根据成员姓名删除一个成员
{
Node *d,*q;
int i;
i=xunzhao(L);
printf("\n%d \n\n",i+1);
d=&(L->elem[i]);
q=L->elem+L->length-1 ;
for(++d;d<=q;++d)
{
strcpy((d-1)->name,d->name);
strcpy((d-1)->address,d->address);
strcpy((d-1)->Email,d->Email);
strcpy((d-1)->ZipCode,d->ZipCode);
strcpy((d-1)->tel,d->tel);
}
L->length--;
printf("\nOK \n\n");
}
void Search(Sqlist *L) //查找成员
{
int i;
i=xunzhao(L);
print(L,i);
}
void swap(char a[],char b[]) //交换 两个字符串
{
char q[30];
strcpy(&q[0],&a[0]);
strcpy(&a[0],&b[0]);
strcpy(&b[0],&q[0]);
}
void Sort(Sqlist *L) //对所有成员按姓名进行排序
{
int i,j,n;
for(i=0;i<L->length;i++)
for(j=i+1;j<L->length;j++)
{
if(strcmp(L->elem[i].name,L->elem[j].name)>0)
{
swap(L->elem[i].name,L->elem[j].name);
swap(L->elem[i].address,L->elem[j].address);
swap(L->elem[i].Email,L->elem[j].Email);
swap(L->elem[i].ZipCode,L->elem[j].ZipCode);
swap(L->elem[i].tel,L->elem[j].tel);
}
}
printf("\nOK \n\n");
}
void writein(Sqlist *L) //由文件写入程序
{
FILE *fp;
int i,o=1;
if((fp=fopen("F:\\Display.txt","r"))==NULL)
{
printf("can not open file\n");
return;
}
for(i=0;i<MaxSize;i++)
{
if(feof(fp)==1) break;
if(fread(&(L->elem[i]),sizeof(Node),1,fp)!=1)
{
o=0;
printf("file read error,\n");
break;
}
}
fclose(fp);
if(o!=0)
{
printf("\nok\n\n");
Display(L);
}
}
main()
{
int j,x;
Sqlist L;
InitSqlist(&L);
while(1)
{
x=508;
do
{
if(x!=508) printf("\nInput wrong,please trying again.\n\n");
printf("请输入:\n1:插入\n2:删除\n3:查找\n4:排序\n5:输出\n6:退出\n");
scanf("%d",&x);
}while(x<1 || x>8);
switch(x)
{
case 1: Insert(&L); break;
case 2: Delete(&L); break;
case 3: Search(&L); break;
case 4: Sort(&L); break;
case 5: Display(&L); break;
case 6: exit(0);
}
}
}
通讯录普遍存在于现代智能手机中,我们经常使用通讯录来联系好友,我们涉及到的操作就是插入,删除,查找,还有一个后台运行的排序和显示功能。现在需要设计一个通讯录来保存联系人。
通讯录中的联系人变化的,有的人会大量的插入删除,有的人很少插入删除,所以要分类讨论,但是还是要参考大部分人的使用习惯。
每一个用户都有姓名,电话,邮箱,地址等等成员变量需要保存,而且有时候要考虑到已经存储的问题,还有存储位置的选择。
逻辑结构选用线性的线性表结构,因为联系人都是一个一个下去的,没有树和图的错从复杂的逻辑结构。
采用链式的存储结构,考虑到通讯录本就是添加和删除用户,对于现在的年轻上班族来说,很有必要,虽然没有了顺序的方便读取的优点,但也方便存取。
Insert函数控制插入
Delete函数控制删除
Sort函数控制排序
Display函数控制显示
Search函数控制查找