本人使用makefile文件,所以总代码分为四部分
tele.h:
#ifndef TELE_H
#define TELE_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
char name[12];//姓名
char sex[10];//性别
int age;//年龄
char num[15];//电话
struct node *next;
};
typedef struct node Node;
typedef struct node * Link;
void display(Link head);
void insert_node(Link head,Link new_node);
void make_empty(Link head);
void delete_node(Link head);
void search(Link head);
void mod_node(Link head);
#endif
tele.c:
#include"tele.h"
void display(Link head)//遍历链表并输出每个结点的内容
{
Link p;
p = head->next;
if(NULL == p)//如果头结点后没有结点,那么没有联系人
{
printf("电话簿没有联系人!\n");
return;
}
while(p!= NULL)
{
printf("%s ",p->name );
printf("%s ",p->sex );
printf("%d ",p->age );
printf("%s\n",p->num );
p = p->next;
}
}
void create_link(Link * head)//新建一个头结点初始化链表
{
*head=(Link)malloc(sizeof(Node));
(*head)->next = NULL;
}
void insert_node(Link head,Link new_node)
{
Link p,q;
q = head;
p = q->next;
new_node=(Link)malloc(sizeof(Node));
printf("输入姓名:\n");
scanf("%s",new_node->name);//输入姓名
while(1==1)//判断性别输入是否正确
{
printf("输入性别:(male or female)\n");
scanf("%s",new_node->sex);//输入性别
if((strcmp(new_node->sex,"male")!=0)&&(strcmp(new_node->sex,"female")!=0))
{
printf("性别输入错误!\n");
}
else
break;
}
while(1==1)
{
printf("输入年龄:\n");
scanf("%d",&new_node->age);//输入年龄
if(new_node->age<0||new_node->age>120)
{
printf("年龄错误!\n");
}
else
break;
}
while(1==1)//输入号码并判断号码位数是否正确
{
printf("输入号码:\n");
scanf("%s",new_node->num);
if(strlen(new_node->num)!=11)
{
printf("号码错误!\n");
}
else
break;
}
if(NULL == p)
{
q->next = new_node;
new_node = p;
}
else
{
while(strcmp((new_node->name),(p->name))==1)
{
p = p->next;
q = q->next;
}
new_node->next = p;
q->next = new_node;
}
}
void make_empty(Link head)//释放掉除了头结点以外结点的空间
{
Link p;
p = head->next;
while(p!=NULL)
{
head->next = p->next;
free(p);
p = head->next;
}
printf("清空成功\n");
}
void delete_node(Link head)
{
Link p,q;
char comp[20];
p = head->next;
q = head;
printf("请输入要删除的联系人姓名:\n");//输入要删除联系人的姓名
scanf("%s",comp);
if(p == NULL)
{
printf("电话簿没有联系人!\n");
}
else
{
while(p != NULL && (strcmp(p->name,comp)!=0))//判断姓名是否相同,不同就继续遍历
{
q = p;
p = p->next;
}
if(NULL == p)//链表中没有对应姓名的结点
{
printf("没有该联系人!\n");
}
else
{
q->next = p->next;
free(p);
}
}
}
void search(Link head)
{
char comp[20];
Link q=head;
Link p=q->next;
printf("输入要查找的联系人姓名:\n");//输入要查找的联系人的姓名
scanf("%s",comp);
while(p!=NULL&&(strcmp(p->name,comp)!=0))
{
q=p;
p=p->next;
}
if(NULL == p)
{
printf("查无此人!\n");
return;
}
else//输出联系人所有信息
{
printf("%s\t",p->name );
printf("%s\t",p->sex );
printf("%d\t",p->age );
printf("%s\n",p->num );
}
}
void mod_node(Link head)//修改结点内所有信息
{
char comp[20];
Link q=head;
Link p=q->next;
printf("输入要修改的联系人姓名:\n");
scanf("%s",comp);
while(p!=NULL&&(strcmp(p->name,comp)!=0))
{
q=p;
p=p->next;
}
if(NULL == p)
{
printf("没有该联系人!\n");
return;
}
else
{
printf("输入修改姓名:\n");
scanf("%s",p->name);//输入姓名
while(1==1)//判断性别输入是否正确
{
printf("输入修改性别:(male or female)\n");
scanf("%s",p->sex);//输入性别
if((strcmp(p->sex,"male")!=0)&&(strcmp(p->sex,"female")!=0))
{
printf("性别输入错误!\n");
}
else
break;
}
while(1==1)
{
printf("输入修改年龄:\n");
scanf("%d",&p->age);//输入年龄
if(p->age<0||p->age>120)
{
printf("年龄错误!\n");
}
else
break;
}
while(1==1)//输入号码并判断号码位数是否正确
{
printf("输入修改号码:\n");
scanf("%s",p->num);
if(strlen(p->num)!=11)
{
printf("号码错误!\n");
}
else
break;
}
}
}
main.c:
#include"tele.h"
int main()
{
int i,j,m;
Link head;
Link new_node;
create_link(&head);
while(1 == 1)
{
printf("----------------电话簿---------------\n");
printf("-----------1.显示所有联系人-----------\n");
printf("-----------2.新建联系人---------------\n");
printf("-----------3.搜索联系人---------------\n");
printf("-----------4.删除联系人---------------\n");
printf("-----------5.清空联系人---------------\n");
printf("-----------6.修改联系人---------------\n");
printf("-----------7.退出电话簿---------------\n");
printf("请输入对应功能的数字:\n");
scanf("%d",&m);
switch(m)
{
case 1:display(head);break;
case 2:insert_node(head,new_node);break;
case 3:search(head);break;
case 4:delete_node(head);break;
case 5:make_empty(head);break;
case 6:mod_node(head);break;
case 7:return 0;
}
}
}
makefile:
tele:main.o tele.o
@gcc tele.o main.o -o tele
main.o:main.c
@gcc -c main.c
tele.o:tele.c
@gcc -c tele.c
.PHONE: clean
clean:
@rm -f *.o tele
最后只要make就可以实现通讯录功能。