用c语言的链表和文件编写一个通讯录,下面是代码
#include
#include
#include
#include
#include
#include
#include
//学生节点
struct Address
{
int id ;
char name[20] ;
char number[15];
char address[20];
struct Address *next ;
};
typedef struct Address Node ;
typedef struct Address *Link ;
void creat_link(Link *head)
{
(*head) = (Link)malloc(sizeof(Node));
(*head)->next = NULL ;
}
//输出提示信息
void myprint()
{
printf ("请输入要选择的编号(0-7)\n");
printf (" 1--创建通讯录 \n");
printf (" 2--显示通讯录 \n");
printf (" 3--修改通讯录 \n");
printf (" 4--增加通讯录 \n");
printf (" 5--删除通讯录 \n");
printf (" 6--查询通讯录 \n");
printf (" 7--保存到文件 \n");
printf (" 8--从文件读取 \n");
printf (" 0--退出通讯录 \n");
printf ("\n");
}
//创造通讯录
void creat_address(Link head)
{
int gg = 1;
int go ;
Link p,nnode ;
while(gg == 1)
{
nnode = (Link)malloc(sizeof(Node)) ;
p = head ;
printf("请输入你需要添加的信息\n") ;
printf("**********************\n") ;
printf("编号 : ") ;
scanf("%d",&nnode->id) ;
printf("姓名 : ") ;
scanf("%s",nnode->name) ;
printf("电话号码: ") ;
scanf("%s",nnode->number) ;
printf("地址 : ");
scanf("%s",nnode->address) ;
while(p->next != NULL)
{
p = p->next ;
}
p->next = nnode ;
nnode->next = NULL ;
printf("要结束输出吗?如果结束请输入1,不结束输入0\n") ;
scanf("%d",&go) ;
gg = go ;
}
}
//显示通讯录
void display_address(Link head)
{
Link p ;
p = head->next ;
if(head == NULL)
{
printf("没有通讯录\n") ;
}
printf("***编号*************姓名***********电话号码*******地址\n");
while(p != NULL)
{
printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
p = p->next ;
}
printf("*****************************************************\n") ;
}
//修改通讯录
void modify_address(Link head)
{
Link p,q ;
q = head ;
p = head->next ;
char m_name[20] ;
int a ;
int m_id ;
printf("1——通过编号修改,2——通过姓名修改") ;
scanf("%d",&a) ;
if(a == 1)
{
printf("请输入要修改的编号\n") ;
scanf("%d" ,&m_id);
while(p != NULL && p->id != m_id)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个编号\n") ;
}
else
{
printf ("请输入需要改变的数据\n") ;
printf("编号——将×%d×修改为 : \n",p->id) ;
scanf("%d",&p->id) ;
printf("姓名——将×%s×修改为 : \n",p->name) ;
scanf("%s",p->name) ;
printf("号码——将×%s×修改为 :\n",p->number) ;
scanf("%s",p->number) ;
printf("地址——将×%s×修改为 : \n",p->address) ;
scanf("%s",p->address) ;
}
}
if(a == 2)
{
printf("请输入要修改的名字\n") ;
scanf("%s",m_name) ;
while(p != NULL && strcmp(p->name,m_name) != 0)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个名字\n") ;
}
else
{
printf ("请输入需要改变的数据\n") ;
printf("编号——将×%d×修改为 : \n",p->id) ;
scanf("%d",&p->id) ;
printf("姓名——将×%s×修改为 : \n",p->name) ;
scanf("%s",p->name) ;
printf("号码——将×%s×修改为 :\n",p->number) ;
scanf("%s",p->number) ;
printf("地址——将×%s×修改为 : \n",p->address) ;
scanf("%s",p->address) ;
}
}
}
//增加通讯录
void add_address(Link head)
{int gg = 1;
int go ;
Link p,nnode ;
while(gg == 1)
{
nnode = (Link)malloc(sizeof(Node)) ;
p = head ;
printf("请输入你需要添加的信息\n") ;
printf("**********************\n") ;
printf("编号 : ") ;
scanf("%d",&nnode->id) ;
printf("姓名 : ") ;
scanf("%s",nnode->name) ;
printf("电话号码: ") ;
scanf("%s",nnode->number) ;
printf("地址 : ");
scanf("%s",nnode->address) ;
while(p->next != NULL)
{
p = p->next ;
}
p->next = nnode ;
nnode->next = NULL ;
printf("要结束输出吗?如果结束请输入1,不结束输入0\n") ;
scanf("%d",&go) ;
gg = go ;
}
}
// 删除功能实现
void delete_address(Link head)
{
Link q,p ;
q = head ;
p = head->next ;
int a ;
char d_name[20] ;
int d_id ;
printf("1——根据编号删除,2——根据姓名删除") ;
scanf("%d",&a) ;
if(a == 1)
{
printf("请输入要删除的编号\n") ;
scanf("%d",&d_id) ;
while(p != NULL && p->id != d_id)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个编号\n") ;
}
else
{
q->next = p->next ;
free(p) ;
}
printf("删除了\n") ;
}
if(a == 2)
{
printf("请输入要删除的名字\n") ;
scanf("%s",d_name) ;
while(p != NULL && strcmp(p->name,d_name) != 0)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个姓名\n") ;
}
else
{
q->next = p->next ;
free(p) ;
}
printf("删除了\n") ;
}
}
//查询功能
void inquire_address(Link head)
{
Link p,q ;
q = head ;
p = head->next ;
char i_name[20] ;
int a ;
int i_id ;
printf("1——通过编号查询,2——通过姓名查询") ;
scanf("%d",&a) ;
if(a == 1)
{
printf("请输入要查询的编号\n") ;
scanf("%d" ,&i_id);
while(p != NULL && p->id != i_id)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个编号\n") ;
}
else
{
printf("***编号*************姓名***********电话号码*******地址\n");
printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
printf("*****************************************************\n") ;
}
}
if(a == 2)
{
printf("请输入要修改的名字\n") ;
scanf("%s",i_name) ;
while(p != NULL && strcmp(p->name,i_name) != 0)
{
q = p ;
p = p->next ;
}
if(p == NULL)
{
printf("没有这个名字\n") ;
}
else
{
printf("***编号*************姓名***********电话号码*******地址\n");
printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
printf("*****************************************************\n") ;
}
}
}
//保存到文件中
void save_address(Link head)
{
FILE *fp;
fp = fopen("通讯录.txt","wb+") ;
if(NULL == fp)
{
printf("没有这个文件\n") ;
return ;
}
Link p ;
p = head->next ;
while(p != NULL)
{
fwrite(p,sizeof(Node)-4,1,fp) ;
fputc('\n',fp) ;
p = p->next;
}
printf("保存了\n") ;
fclose(fp) ;
}
//从文件中读取
void read_address(Link head)
{
FILE *fp ;
fp = fopen("通讯录.txt","r+") ;
if(NULL == fp)
{
printf("没有这个文件\n") ;
return ;
}
Link p,nnode ;
p = (Link)malloc(sizeof(Node)) ;
while((fread(p,sizeof(Node)-3,1,fp)) != 0)
{
while(p->next != NULL)
{
p = p->next ;
}
nnode = (Link)malloc(sizeof(Node)) ;
p->next = nnode ;
nnode->next = NULL ;
}
}
int main()
{
int x ;
Link head ;
creat_link(&head) ;
while(1)
{
myprint();
printf("请输入数字——");
scanf("%d",&x) ;
switch(x)
{
case 1 :
printf("********************\n") ;
printf("****通讯录的创建****\n") ;
printf("********************\n") ;
creat_address(head) ;
break;
case 2 :
printf("××××××××××××××××××××\n") ;
printf("××××通讯录的显示××××\n") ;
printf("××××××××××××××××××××\n") ;
display_address(head) ;
break ;
case 3 :
printf("********************\n") ;
printf("****通讯录的修改****\n") ;
printf("********************\n") ;
modify_address(head) ;
break ;
case 4 :
printf("********************\n") ;
printf("****通讯录的增加****\n") ;
printf("********************\n") ;
add_address(head) ;
break ;
case 5 :
printf("********************\n") ;
printf("****通讯录的删除****\n") ;
printf("********************\n") ;
delete_address(head) ;
break ;
case 6 :
printf("********************\n") ;
printf("****通讯录的查询****\n") ;
printf("********************\n") ;
inquire_address(head) ;
break ;
case 7 :
printf("********************\n") ;
printf("****保存到文件中****\n") ;
printf("********************\n") ;
save_address(head) ;
break ;
case 8 :
printf("********************\n") ;
printf("****从文件中读取****\n") ;
printf("********************\n") ;
read_address(head) ;
break ;
case 0 :
return 0 ;
default :
printf("输入错误\n") ;
break;
}
}
save_address(head) ;
}