LinkList.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef enum {TRUE, FALSE, ERROR } BOOL;
typedef struct data
{
int id;
char name[20];
char addr[20];
long long tel;
long long off;
}Data;
typedef struct node
{
Data data;
struct node *next;
}Node;
typedef struct _list
{
Node *head;
}List;
// 创建链表
List* CreateList();
//尾插
BOOL Insert_Last(List *ls,Data data);
//删除特定位置的数据
//pos:第pos个结点位置
BOOL Delete_Data(List *ls);
void Destroy(List *ls);
void Display(List *ls);
#endif // _LINKLIST_H_
LinkList.c
#include "LinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
List* CreateList()
{
List *ls = (List*)malloc(sizeof(List)/sizeof(char));
if (NULL == ls)
return NULL;
// 创建头节点
ls->head = (Node*)malloc(sizeof(Node)/sizeof(char));
if(NULL == ls->head)
{
free(ls);
return NULL;
}
ls->head->next=NULL;//空链表
return ls;
}
BOOL Insert_Last(List *ls,Data data)
{
if (NULL == ls)
return ERROR;
Node *node =(Node*)malloc(sizeof(Node)/sizeof(char));
if(NULL==node)
return ERROR;
node->data=data;
node->next=NULL;
Node *tmp=ls->head;
while(tmp->next)//while里面是tmp->next,设定tmp=ls->hesd
{
tmp=tmp->next;
}
tmp->next=node;
return TRUE;
}
BOOL Delete_Data(List *ls)
{
if (NULL == ls)
return ERROR;
char g_name[20];
printf("\t\t请输入你想要删除的好友姓名\n\t\t");
scanf("%s", g_name);
// if (flag==0)
// {
// printf("删除成功!\n");
// }
Node *tmp=ls->head;
while(tmp->next)
{
if(strcmp(tmp->next->data.name, g_name)==0)
{
Node *p=tmp->next;
tmp->next=p->next;
free(p);
return TRUE;
}
tmp=tmp->next;
}
return TRUE;
}
void Display(List *ls)
{
if (NULL == ls)
return ;
Node *tmp=ls->head;//while里面是tmp,设定tmp=ls->hesd->next
printf("\t\t列表好友信息如下\n");
while(tmp->next != NULL)
{
printf("\t\t----------------------------------------------------------------------\n");
printf("\t\tid: %d\t",tmp->next->data.id);
printf(" 姓名: %s\t",tmp->next->data.name);
printf(" 家庭住址:%s\t",tmp->next->data.addr);
printf(" 手机号码:%lld\t",tmp->next->data.tel);
printf(" 公司电话:%lld\n",tmp->next->data.off);
tmp=tmp->next;
}
printf("\t\t----------------------------------------------------------------------\n");
}
void Destroy(List* ls)
{
if (NULL == ls)
return;
Node *tmp=ls->head;
while(tmp->next)
{
Node *p=tmp->next;
tmp->next=p->next;
free(p);
}
free(ls->head);
free(ls);
}
main.c
#include <stdio.h>
#include "LinkList.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int g_id=1;
enum menu{ADD = '1', DISPLAY, SEARCH, DELETE, QUIT };
int read_file(List *ls)
{
int fd = open("tmp.txt", O_RDONLY);
if (-1 == fd)
{
perror("打开tmp.txt文件失败");
return -1;
}
// 获取文件大小
off_t ret1 = lseek(fd, 0, SEEK_END);
if(0 == ret1)
{
return;
}
lseek(fd, 0, SEEK_SET);
Node *tmp = ls->head->next;
ssize_t ret2;
Data data;
while((ret2 = read(fd, &data, sizeof(Data))) != 0)
{
if (-1 == ret2)
{
perror("读失败");
return -1;
}
Insert_Last(ls,data);
}
close(fd);
}
int save_file(List *ls)
{
if (NULL == ls)
return ;
if(ls->head->next==NULL)
{
return;
}
Node *tmp=ls->head;
int fd = open("tmp.txt", O_WRONLY|O_CREAT | O_TRUNC, 0766);
if (-1 == fd)
{
perror("打开tmp.txt文件失败");
return -1;
}
while(tmp->next != NULL)
{
ssize_t ret = write(fd, &(tmp->next->data), sizeof(Data));
if (-1 == ret)
{
perror("写入失败");
return -1;
}
tmp=tmp->next;
}
close(fd);
}
void add(List *ls)
{
Data data;
data.id=g_id++;
printf("\t\t 请输入好友姓名: ");
scanf("%s",data.name);
printf("\t\t 请输入好友家庭住址: ");
scanf("%s",data.addr);
printf("\t\t 请输入好友手机号码: ");
scanf("%lld",&data.tel);
printf("\t\t 请输入好友公司电话: ");
scanf("%lld",&data.off);
Insert_Last(ls, data);
printf("\t\t好友添加成功\n");
}
void find(List *ls)
{
char g_name[20];
printf("\t\t请输入你想要查找的好友姓名\n");
printf("\t\t");
scanf("%s",g_name);
getchar();
Node *tmp=ls->head;
printf("\t\t");
while(tmp->next)
{
if(strcmp(tmp->next->data.name, g_name)==0)
{
printf("-------------------\n");
printf("\t\t您查找的好友信息如下\n");
printf("\t\t id: %d\n",tmp->next->data.id);
printf("\t\t 姓名: %s\n",tmp->next->data.name);
printf("\t\t 家庭住址:%s\n",tmp->next->data.addr);
printf("\t\t 手机号码:%lld\n",tmp->next->data.tel);
printf("\t\t 公司电话:%lld\n",tmp->next->data.off);
printf("\t\t--------------------\n");
break;
}
}
}
int main()
{
List *ls = CreateList();
if (NULL == ls)
{
printf ("创建链表失败\n");
}
printf ("创建链表成功\n");
read_file(ls);
char order[10];
while(1)
{
system("clear");
printf("\t\t--------------\n");
printf("\t\t 1:添加好友信息\n");
printf("\t\t 2:列表好友信息\n");
printf("\t\t 3:搜索好友\n");
printf("\t\t 4:删除好友\n");
printf("\t\t 5: 退出\n");
printf("\t\t--------------\n");
printf("\t\t请输入你需要操作的指令序号\n");
printf("\t\t");
fgets(order,10, stdin);
system("clear");
switch(order[0])
{
case ADD:
add(ls);
break;
case DISPLAY:
Display(ls);
break;
case SEARCH:
find(ls);
break;
case DELETE:
Delete_Data(ls);
break;
case QUIT:
save_file(ls);
return 0;
default:
printf ("\t\t指令错误\n");
break;
}
printf ("\t\t按Enter键返回\n");
getchar();
}
return 0;
}