list.h
#ifndef LIST_H
#define LIST_H
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//链表节点数据
typedef struct list_data
{
char name[10];
char drr[20];
char phone[3][11];
}List_data;
//链表结构
typedef struct list
{
List_data data;
struct list* next;
}List;
List* list_create(void);
List* node_create(List_data data);
void list_add(List *head_node,List_data data);
void list_delete(List *head_node,List_data data);
void list_change(List *head_node,List_data change_data,List_data data);
void list_find(List *head_node,List_data data);
void list_print(List *head_node);
void outlink(List *head);
List* createlink(void);
#endif // LIST_H
list.c
#include"list.h"
List* list_create(void)
{
List *head_node=(List*)malloc(sizeof (List));
head_node->next=NULL;
return head_node;
}
List* node_create(List_data data)
{
List *new_node=(List*)malloc(sizeof (List));
for (int i=0;i<10;i++) {
new_node->data.name[i]=data.name[i];
}
for (int i=0;i<20;i++) {
new_node->data.drr[i]=data.drr[i];
}
for (int i=0;i<3;i++) {
for (int j=0;j<11;j++) {
new_node->data.phone[i][j]=data.phone[i][j];
}
}
new_node->next=NULL;
return new_node;
}
void list_add(List *head_node,List_data data)
{
List *new_node=node_create(data);
List *tail_node=head_node;
while(tail_node->next != NULL)
{
tail_node = tail_node->next;
}
tail_node->next = new_node;
}
void list_delete(List *head_node,List_data data)
{
List *pos_node = head_node->next;
List *pos_node_front = head_node;
if (pos_node == NULL)
printf("无法删除,链表为空!\n");
else
{
while (strcmp(pos_node->data.name,data.name)!=0)
{
pos_node_front = pos_node;
pos_node = pos_node->next;
if (pos_node == NULL)
{
printf("没有找到相关信息,无法删除!\n");
return;
}
}
pos_node_front->next = pos_node->next;
free(pos_node);
pos_node = NULL;
}
}
void list_change(List *head_node,List_data change_data,List_data data)
{
List *pos_node = head_node->next;
if (pos_node == NULL)
printf("无法修改,链表为空!\n");
else
{
while (strcmp(pos_node->data.name,data.name)!=0)
{
pos_node = pos_node->next;
if (pos_node == NULL)
{
printf("没有找到相关信息,无法修改!\n");
return;
}
}
pos_node->data = change_data;
}
}
void list_find(List *head_node,List_data data)
{
List *pos_node = head_node->next;
if (pos_node == NULL)
printf("无法查找,链表为空!\n");
else
{
while (strcmp(pos_node->data.name,data.name)!=0)
{
pos_node = pos_node->next;
if (pos_node == NULL)
{
printf("没有找到相关信息!\n");
return;
}
}
printf("姓名:%s 电话:%s 地址:%s\n",pos_node->data.name,pos_node->data.phone[0],pos_node->data.drr);
}
}
void list_print(List *head_node)
{
List *pos_node = head_node->next;
while (pos_node)
{
printf("姓名:%s 电话:%s 地址:%s\n",pos_node->data.name,pos_node->data.phone[0],pos_node->data.drr);
pos_node = pos_node->next;
}
}
List* createlink(void)
{
List *head =(List*)malloc(sizeof(List));
char t1[10];
char t2[3][11];
char t3[20];
List *p;
List *q;
p=q=head;
FILE * r= fopen("output.txt","r");
if(r==NULL)
{
printf("打开文件失败!");
return NULL;
}
while(fscanf(r,"姓名:%s 电话:%s 地址:%s\n",t1,t2[0],t3)!=EOF)
{
q= (List*)malloc(sizeof(List));
strcpy(q->data.name,t1);
strcpy(q->data.phone[0],t2[0]);
strcpy(q->data.drr,t3);
p->next=q;
p=q;
}
p->next=NULL;
return head;
}
void outlink(List *head)
{
List *p=head->next;
FILE *w =fopen("output.txt","w");
if(w==NULL)
{
printf("打开文件失败!");
return;
}
while(p)
{
//输出链表节点数据到屏幕
//printf("%s ",p->data.name);
//输出链表节点数据到文件output.txt
fprintf(w,"姓名:%s 电话:%s 地址:%s\n",p->data.name,p->data.phone[0],p->data.drr);
p=p->next;
}
printf("\n");
fprintf(w,"\n");
fclose(w);
return;
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
int main()
{
//从文件加载通讯录
List* list;
list=createlink();
list_print(list);
printf("通讯录加载完毕!\n\n");
//添加联系人信息
List_data data;
int people_number;
printf("请输入要添加信息的人数:");
scanf("%d",&people_number);
for (int i=0;i<people_number;i++) {
printf("请输入姓名:");
scanf("%s",data.name);
printf("请输入电话:");
scanf("%s",data.phone[0]);
printf("请输入地址:");
scanf("%s",data.drr);
list_add(list,data);
}
system("cls");
list_print(list);
//删除指定联系人
printf("\n请输入要删除信息人的姓名:");
scanf("%s",data.name);
list_delete(list,data);
system("cls");
printf("该联系人信息已删除!\n\n");
list_print(list);
//查找指定联系人
printf("\n请输入要查找的姓名:");
scanf("%s",data.name);
list_find(list,data);
//修改指定联系人
printf("\n请输入要修改的姓名:");
scanf("%s",data.name);
List_data change_data;
printf("请输入修改后姓名:");
scanf("%s",change_data.name);
printf("请输入修改后电话:");
scanf("%s",change_data.phone[0]);
printf("请输入修改后地址:");
scanf("%s",change_data.drr);
list_change(list,change_data,data);
printf("\n修改完成!\n");
list_print(list);
//保存文件
outlink(list);
printf("\n文件已保存到“output.txt”!\n");
return 0;
}