用单链表实现简易通讯录
刚刚学了单链表,做个通讯录试试,数据的存储还没学过,所以这通讯录暂时还无法实现资料的存储和读取。。。等以后学到这方面再加以完善吧
(代码编写(缝缝补补)过程中有些乱七八糟的东西没清理,不过能运行成功就不错了)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct st
{
char name[10];
long int num;
char sex[5];
char addr[20];
struct st *next;
}st;
typedef struct st *List;
int out(List *L);//鬼知道为什么别的函数都不用声明就这个需要声明,,,垃圾vc6
int input(List *L)
{
//int i;
List s,f;
char yn;
int flag=0;
f=(*L)->next;
s=(List)malloc(sizeof(st));//建立新联系人
printf("\n输入姓名:\n");
scanf("%s",s->name);
while (f != NULL )
{
if (strcmp(s->name,f->name) == 0 )
{
printf("\n该联系人已存在,是否覆盖?(y or n)\n");
scanf("%c",&yn);
getchar();
if (yn == 'y')
{
flag=1;//不执行后续程序
break;
}
}
f=f->next;
}
printf("输入号码:\n");
scanf("%d",&s->num);
printf("输入性别:\n");
scanf("%s",s->sex);
printf("输入地址:\n");
scanf("%s",s->addr);
printf("\n");
if (flag == 0)//插入新联系人
{
s->next = (*L)->next;
(*L)->next = s;
}
else if (flag==1)
{
f=s;
printf("\n已覆盖\n\n");
}
return 0;
}
int change(List *L)
{
List s;
List f;
//s=(List)malloc(sizeof(st));
char na[10];
char se[5];
char add[20];
long int nu;
f=(*L)->next;
printf ("\n输入姓名:\n");
scanf("%s",na);
while(strcmp(f->name,na) != 0 && f != NULL)
{
f=f->next;
}
if (strcmp(f->name,na) == 0)
{
printf("修改号码(不修改则按0):\n");
scanf("%d",&nu);
if (nu != 0)
{
f->num=nu;
}
printf("修改性别(不修改则按0):\n");
scanf("%s",se);
if (strcmp(se,"0") != 0)
{
strcpy(f->sex,se);
}
printf("修改地址(不修改则按0):\n");
scanf("%s",s->addr);
if (strcmp(add,"0") != 0)
{
strcpy(f->addr,add);
}
}
else
{
printf("\n查无此人\n\n");
}
return 0;
}
int delet(List *L)
{
char na[10];
List p,s;
s=*L;
p=s->next;
// p=(*L)->next;
printf("\n输入姓名:\n");
scanf("%s",na);
while(strcmp(p->name,na) !=0 && p != NULL)
{
s=s->next;
p=p->next;
// printf("\npass1\n");同下
}
if (p != NULL)
{
// printf("\npass2\n");测试代码,已无用
s->next=p->next;
printf("删除%s成功\n\n",na);
}
if (p == NULL)
{
printf("\n查无此人\n\n");
}
// free(p);
//free(s);//还没弄清楚free怎么用,free一下整个程序炸穿了,先注释掉吧。。。
return 0;
}
int find(List *L)
{
int i,j;
long int nu;//number
char a[20];//address
short int zhiling;
int flag=0;//exit flag
int flag_1=0;
List p;
while(!flag)
{
p=(*L)->next;
if (p == NULL)
{
printf("\n空通讯录\n\n");
break;
}
printf("\n序号查找按1\n姓名查找按2\n号码查找按3\n地址查找按4\n输出所有联系人按5\n退出查找按6\n");
scanf("%d",&zhiling);
switch(zhiling)
{
case 1:
printf("\n输入序号:\n");
scanf("%d",&i);
for (j=0; j<i-1; j++)
{
p=p->next;
}
if (p == NULL || j > i-1)
{
printf("\n查无此人\n\n");
break;
}
out(&p);
break;
case 2:
printf("\n输入姓名\n");
scanf("%s",a);
while (strcmp(p->name,a) != 0 && p->next != NULL)
{
p=p->next;
}
if (strcmp(p->name,a) != 0 && p->next == NULL)
{
printf("\n查无此人\n\n");
break;
}
out(&p);
break;
case 3:
printf("\n输入号码:\n");
scanf("%d",&nu);
while (p->num != nu && p->next != NULL)
{
p=p->next;
}
if (p->num != nu)
{
printf("\n查无此人\n\n");
break;
}
out(&p);
break;
case 4:
flag_1 = 0;
printf("\n输入地址\n");
scanf("%s",a);
while ( p != NULL)
{
if (strcmp(p->addr,a) == 0)
{
out(&p);
flag_1 = 1;
}
p=p->next;
}
if (flag_1 == 0)
{
printf("\n查无此人\n\n");
}
break;
case 5:
while (p != NULL)
{
out(&p);
p=p->next;
}
break;
case 6:
flag=1;
break;
default:
printf("\n错误的指令\n\n");
break;
}
}
return 0;
}
int Exit(List *L)
{
return 0;
}
int save(List *L)
{
List p;
p=(*L)->next;
FILE *fpw=fopen("list.txt","w");
while (p != NULL)
{
fprintf(fpw,"\n姓名:%s\n",p->name);
fprintf(fpw,"性别:%s\n",p->sex);
fprintf(fpw,"号码:%d\n",p->num);
fprintf(fpw,"地址:%s\n",p->addr);
p=p->next;
}
fclose(fpw);
return 0;
// return 0;
}
/*int read(List *L)
{
FILE *fpr=fopen("list.txt","r");
}*/
int out(List *L)
{
printf("\n姓名:%s\n性别:%s\n号码:%d\n地址:%s\n\n",(*L)->name,(*L)->sex,(*L)->num,(*L)->addr);
return 0;
}
int main()
{
int count=0;
int i;
int flag;
int n=0;
int save_flag=0;
List l;
l = (List)malloc(sizeof(st));
l->next=NULL;
while (flag)
{
printf("\n新建联系人按1\n删除联系人按2\n查询联系人按3\n修改联系人按4\n保存联系人按5\n退出按6\n");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1:input(&l);
break;
case 2:delet(&l);
break;
case 3:find(&l);
break;
case 4:change(&l);
break;
case 5:printf("\n未完成\n\n");
// save_flag=save(&l);
break;
case 6: flag=Exit(&l);
break;
default:
printf("\nerror\n\n");
break;
}
}
return 0;
}
运行效果图:
新建联系人,如有重复询问是否覆盖,输入y覆盖,输入n则无视重复并新建此联系人
查找,根据对应信息查找联系人,如目标不存在返回“查无此人”
恩。。。。没时间了,还得复习呢,不写了不写了,就先这样吧