目录
总体思路
具体代码
编译通过
总体代码
一、创建一个结构体保存通讯录信息。
二、构建链表,并存于文件中。
三、实现链表结点的增加、删除、查询、输出。
一、创建一个结构体,保存信息。
typedef struct{ //创建结构体,储存个人信息
int num;
char name[20];
char Tel_1[20];
char Tel_2[20];
char HomeTel[20];
char OfficeTel_1[20];
char OfficeTel_2[20];
char position[20];
char post[20];
char mail_address[20];
}Person;
二、用尾插法创建一个链表,并让用户选择是否输入数据。
typedef int ElemType;
typedef struct Node{
Person data; //数据域
struct Node *next; //指针域
}LinkNode,* LinkList;
LinkNode *CreateFromTail(){
LinkList head;
LinkNode *s,*r;
char flag;
flag='Y'; //建表结束标志,初始值为Y
printf("不知道写什么的时候就填“无”吧~\n");
head=(LinkNode *)malloc(sizeof(LinkNode));
head->next=NULL;
r=head; //尾指针指向链表当前表尾
printf("开始创建:\n");
while(flag=='Y'||flag=='y'){
s=(LinkNode *)malloc(sizeof(LinkNode));
printf("姓名:\n");
scanf(" %s",&s->data.name);//空格吸收回车键
printf("电话1:\n");
getchar();
scanf(" %s",&s->data.Tel_1);
printf("电话2:\n");
scanf(" %s",&s->data.Tel_2);
printf("家庭电话:\n");
scanf(" %s",&s->data.HomeTel);
printf("公司电话1:\n");
scanf(" %s",&s->data.OfficeTel_1);
printf("公司电话2:\n");
scanf(" %s",&s->data.OfficeTel_2);
printf("职位:\n");
scanf(" %s",&s->data.position);
printf("电邮:\n");
scanf(" %s",&s->data.post);
printf("通信地址:\n");
scanf(" %s",&s->data.mail_address);
r->next=s;
r=s;
getchar();//读入回车键
printf("继续输入吗?(Y/N):");
scanf(" %s",&flag);
}
r->next=NULL; //建表结束后尾结点指针域置为空
return head; //返回创建的链表头指针
}
三、将链表数据存入文件。
void save(LinkList head){
FILE* fp;
LinkNode* p=head->next;
int i=0;
int n;
n=ListLength(head);
if((fp=fopen("D://www.txt","w+"))==NULL){ //D://www.txt为文件保存路径
printf("打开失败");
exit(-1);
}
else{
printf("\n");
}
for(i;idata.name);
fprintf(fp,"%s\n",p->data.Tel_1);
fprintf(fp,"%s\n",p->data.Tel_2);
fprintf(fp,"%s\n",p->data.HomeTel);
fprintf(fp,"%s\n",p->data.OfficeTel_1);
fprintf(fp,"%s\n",p->data.OfficeTel_2);
fprintf(fp,"%s\n",p->data.position);
fprintf(fp,"%s\n",p->data.post);
fprintf(fp,"%s\n",p->data.mail_address);
p=p->next;
}
printf("成功\n");
fclose(fp); //关闭文件
}
四、结点的增加。
void InsLinkList(LinkNode *p,char *name,char *Tel_1,char *Tel_2,char *HomeTel,char *OfficeTel_1,char *OfficeTel_2,char *position,char *post,char *mail_address){ //结点的插入
LinkNode *s;
s=(LinkNode *)malloc(sizeof(LinkNode));
strcpy(s->data.name,name);//这里需要字符串的传递,需要使用strcpy()函数,函数的参数需要两个指针,
strcpy(s->data.Tel_2,Tel_2);
strcpy(s->data.Tel_2,Tel_2);
strcpy(s->data.HomeTel,HomeTel);
strcpy(s->data.OfficeTel_1,OfficeTel_1);
strcpy(s->data.OfficeTel_2,OfficeTel_2);
strcpy(s->data.position,position);
strcpy(s->data.post,post);
strcpy(s->data.mail_address,mail_address);
s->next=p->next
p->next=s;
}
五、结点的删除。
(得先求一下链表长,对结点的删除、查询有作用)
int ListLength(LinkList head) //求通讯录链表的长度
{ LinkList p;
int length=0;
p=head->next;
while(p)
{ length++;
p=p->next;
}
return length;
}
求出链表才方便定位
int ListDelete(LinkList head,int i){
int j=0;
int length;
LinkNode *p,*q;//p为要删除的前一个节点,q为要删除的节点
p=head;
length=ListLength(head);
if(!p||i>length) //如果是空表或者查询位置不符合要求
return 0;
while(p&&jnext;
j++;
}
q=p->next; //q指向后一个元素
p->next=q->next;
return 1;
}
六、结点的查询。
void GetElem(LinkList head,int i,Person x){//查询第i个成员信息
int j=1;
int length;
LinkList p;
p=head->next;
length=ListLength(head);
if(!p||i>length) //如果是空表或者查询位置不符合要求
printf("未找到!\n");
while(jnext;
j++;
}
x=p->data;
printf("姓名:%s\n",x.name);
printf("电话1:%s\n",x.Tel_1);
printf("电话2:%s\n",x.Tel_2);
printf("家庭电话:%s\n",x.HomeTel);
printf("公司电话1:%s\n",x.OfficeTel_1);
printf("公司电话2:%s\n",x.OfficeTel_2);
printf("职位:%s\n",x.position);
printf("电邮:%s\n",x.post);
printf("通信地址:%s\n",x.mail_address);
}
七、链表的输出。
void OutputNode(LinkList head){
LinkNode *p;
//int i;
p=head->next; //指针p指向头结点
while(p!=NULL){
printf("姓名:%s\n",p->data.name);
printf("电话1:%s\n",p->data.Tel_1);
printf("电话2:%s\n",p->data.Tel_2);
printf("家庭电话:%s\n",p->data.HomeTel);
printf("公司电话1:%s\n",p->data.OfficeTel_1);
printf("公式电话2:%s\n",p->data.OfficeTel_2);
printf("职位:%s\n",p->data.position);
printf("电邮:%s\n",p->data.post);
printf("通信地址:%s\n",p->data.mail_address);
p=p->next;
}
八、建立菜单项(为了便于操作和美观)。
void menu()
{
printf("===========欢迎改善通讯录============\n");
printf("============1.增加联系人=============\n");
printf("============2.删除联系人=============\n");
printf("============3.查找联系人=============\n");
printf("============4.打印通讯录=============\n");
printf("============5.退出通讯录=============\n");
printf("=====================================\n");
}
//通讯录管理
#include
#include
#include
#include
#define MAXSIZE 100
//初始化通讯录,用链表实现数据结构
typedef struct{ //创建结构体,储存个人信息
int num;
char name[20];
char Tel_1[20];
char Tel_2[20];
char HomeTel[20];
char OfficeTel_1[20];
char OfficeTel_2[20];
char position[20];
char post[20];
char mail_address[20];
}Person;
//尾插法创建链表
typedef int ElemType;
typedef struct Node{
Person data;
struct Node *next;
}LinkNode,* LinkList;
LinkNode *CreateFromTail(){
LinkList head;
LinkNode *s,*r;
char flag;
flag='Y'; //建表结束标志,初始值为Y
printf("不知道写什么的时候就填“无”吧~\n");
head=(LinkNode *)malloc(sizeof(LinkNode));
head->next=NULL;
r=head; //尾指针指向链表当前表尾
printf("开始创建:\n");
while(flag=='Y'||flag=='y'){
s=(LinkNode *)malloc(sizeof(LinkNode));
printf("姓名:\n");
scanf(" %s",&s->data.name);//空格吸收回车键
printf("电话1:\n");
getchar();
scanf(" %s",&s->data.Tel_1);
printf("电话2:\n");
scanf(" %s",&s->data.Tel_2);
printf("家庭电话:\n");
scanf(" %s",&s->data.HomeTel);
printf("公司电话1:\n");
scanf(" %s",&s->data.OfficeTel_1);
printf("公司电话2:\n");
scanf(" %s",&s->data.OfficeTel_2);
printf("职位:\n");
scanf(" %s",&s->data.position);
printf("电邮:\n");
scanf(" %s",&s->data.post);
printf("通信地址:\n");
scanf(" %s",&s->data.mail_address);
r->next=s;
r=s;
getchar();//读入回车键
printf("继续输入吗?(Y/N):");
scanf(" %s",&flag);
}
r->next=NULL; //建表结束后尾结点指针域置为空
return head; //返回创建的链表头指针
}
void save(LinkList head){
FILE* fp;
LinkNode* p=head->next;
int i=0;
int n;
n=ListLength(head);
if((fp=fopen("D://www.txt","w+"))==NULL){
printf("打开失败");
exit(-1);
}
else{
printf("\n");
}
for(i;idata.name);
fprintf(fp,"%s\n",p->data.Tel_1);
fprintf(fp,"%s\n",p->data.Tel_2);
fprintf(fp,"%s\n",p->data.HomeTel);
fprintf(fp,"%s\n",p->data.OfficeTel_1);
fprintf(fp,"%s\n",p->data.OfficeTel_2);
fprintf(fp,"%s\n",p->data.position);
fprintf(fp,"%s\n",p->data.post);
fprintf(fp,"%s\n",p->data.mail_address);
p=p->next;
}
printf("成功\n");
fclose(fp);
}
int ListLength(LinkList head) //求通讯录链表的长度
{ LinkList p;
int length=0;
p=head->next;
while(p)
{ length++;
p=p->next;
}
return length;
}
void OutputNode(LinkList head){
LinkNode *p;
//int i;
p=head->next; //指针p指向头结点
while(p!=NULL){
printf("姓名:%s\n",p->data.name);
printf("电话1:%s\n",p->data.Tel_1);
printf("电话2:%s\n",p->data.Tel_2);
printf("家庭电话:%s\n",p->data.HomeTel);
printf("公司电话1:%s\n",p->data.OfficeTel_1);
printf("公式电话2:%s\n",p->data.OfficeTel_2);
printf("职位:%s\n",p->data.position);
printf("电邮:%s\n",p->data.post);
printf("通信地址:%s\n",p->data.mail_address);
p=p->next;
}
}
void InsLinkList(LinkNode *p,char *name,char *Tel_1,char *Tel_2,char *HomeTel,char *OfficeTel_1,char *OfficeTel_2,char *position,char *post,char *mail_address){ //结点的插入
LinkNode *s;
s=(LinkNode *)malloc(sizeof(LinkNode));
strcpy(s->data.name,name);//这里需要字符串的传递,需要使用strcpy()函数,函数的参数需要两个指针,
strcpy(s->data.Tel_1,Tel_1);
strcpy(s->data.Tel_2,Tel_2);
strcpy(s->data.HomeTel,HomeTel);
strcpy(s->data.OfficeTel_1,OfficeTel_1);
strcpy(s->data.OfficeTel_2,OfficeTel_2);
strcpy(s->data.position,position);
strcpy(s->data.post,post);
strcpy(s->data.mail_address,mail_address);
s->next=p->next;
p->next=s;
}
int ListDelete(LinkList head,int i){
int j=0;
int length;
LinkNode *p,*q;//p为要删除的前一个节点,q为要删除的节点
p=head;
length=ListLength(head);
if(!p||i>length) //如果是空表或者查询位置不符合要求
return 0;
while(p&&jnext;
j++;
}
q=p->next; //q指向后一个元素
p->next=q->next;
return 1;
}
void GetElem(LinkList head,int i,Person x){//查询第i个成员信息
int j=1;
int length;
LinkList p;
p=head->next;
length=ListLength(head);
if(!p||i>length) //如果是空表或者查询位置不符合要求
printf("未找到!\n");
while(jnext;
j++;
}
x=p->data;
printf("姓名:%s\n",x.name);
printf("电话1:%s\n",x.Tel_1);
printf("电话2:%s\n",x.Tel_2);
printf("家庭电话:%s\n",x.HomeTel);
printf("公司电话1:%s\n",x.OfficeTel_1);
printf("公司电话2:%s\n",x.OfficeTel_2);
printf("职位:%s\n",x.position);
printf("电邮:%s\n",x.post);
printf("通信地址:%s\n",x.mail_address);
}
void menu()
{
printf("===========欢迎改善通讯录============\n");
printf("============1.增加联系人=============\n");
printf("============2.删除联系人=============\n");
printf("============3.查找联系人=============\n");
printf("============4.打印通讯录=============\n");
printf("============5.退出通讯录=============\n");
printf("=====================================\n");
}
//增加联系人
int main(){
int i,j,location;
LinkList head;
Person x,y;
char Continue='y';
char name[20];
char Tel_1[20];
char Tel_2[20];
char HomeTel[20];
char OfficeTel_1[20];
char OfficeTel_2[20];
char position[20];
char post[20];
char mail_address[20];
printf("欢迎到来,是否要创建一个通讯录呢?(1/0):\n");
scanf("%d",&j);
if(j==1)
head=CreateFromTail();
else {
printf("期待下次见面!\n");
return 0;
}
save(head);
menu();
while(1)//(Continue=='y')
{
printf("请选择您的操作:\n");
scanf("%d",&i);
switch(i){
case 1:printf("已选择1.增加联系人\n");
printf("姓名:\n");
scanf(" %s",&name);//空格吸收回车键
printf("电话1:\n");
getchar();
scanf(" %s",&Tel_1);
printf("电话2:\n");
scanf(" %s",&Tel_2);
printf("家庭电话:\n");
scanf(" %s",&HomeTel);
printf("公司电话1:\n");
scanf(" %s",&OfficeTel_1);
printf("公司电话2:\n");
scanf(" %s",&OfficeTel_2);
printf("职位:\n");
scanf(" %s",&position);
printf("电邮:\n");
scanf(" %s",post);
printf("通信地址:\n");
scanf(" %s",&mail_address);
InsLinkList(head,name,Tel_1,Tel_2,HomeTel,OfficeTel_1,OfficeTel_2,position,post,mail_address);
//OutputNode(head);
break;
case 2:printf("已选择2.删除联系人");
printf("\n输入要删除的位置:");
scanf("%d",&location);ListDelete(head,location);
break;
case 3:printf("已选择3.查找联系人");
printf("\n请输入查询位置:");
scanf("%d",&location);
GetElem(head,location,x);
break;
case 4:printf("已选择4.打印通讯录\n");
OutputNode(head);
break;
case 5:printf("已选择5.退出通讯录\n");exit(0);
default:printf("error\n");break;
}
printf("是否继续对通讯录的操作(1/0):");
scanf(" %s",&Continue);
}
return 0;
}