项目:基于链表的通信录管理意义
对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度模块:
一级菜单内容
1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件
2> 登录模块:使用输入的登录账号和密码与文件存储信息对比
3> 退出系统二级菜单内容:
3> 创建模块create:创建链表完成对通信录的存储
4> 添加数据add:添加通信录的信息放入链表中
5> 查找信息find:可以通过姓名进行查找
6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;
7> 删除信息delete:可根据输入的姓名进行删除
8> 插入信息insert:将给定的信息以及插入位置信息完成插入
9> 展示信息show:将通讯录的所有信息进行展示
10> 导出信息export:将通讯录信息导出到文件中
11> 按照姓名将通讯录排序
12> 返回上一级辅助功能:
13> 初始化链表init:将链表进行初始化
14> 获取链表长度getLength:
15> 统计性别;
test.h
#ifndef _TEST_H__
#define _TEST_H__
typedef char datatype;
//定义结点结构体
typedef struct Node
{
int num; //普通结点数据域
datatype name[20]; //普通结点数据域
char sex; //普通结点数据域
datatype phone[20]; //普通结点数据域
int len; //头结点数据域
struct Node *next; //指向下一个结点的指针
}*LinkList, Node;
//创建链表
LinkList list_create();
//申请结点封装数据函数
LinkList apply_node(int num,datatype* n,char s,datatype* ph);
//判空
int list_empty(LinkList L);
//头插
int list_insert_head(LinkList L,int num,datatype* name,char sex,datatype* phone);
//查找信息
void find_name(LinkList L,datatype* name);
//遍历
void list_show(LinkList L);
//修改信息
void updata_name(LinkList L,datatype* name,int new_num,datatype* new_name,char new_sex,datatype* new_phone);
//删除信息
void delete_name(LinkList L,datatype* name);
//按位置进行查找函数,返回找到的结点
int find_pos(LinkList L,datatype* name);
//插入信息
void intsert_pos(LinkList L,int pos,int num,datatype* name,char sex,datatype* phone);
//导出文件
void export_name(LinkList L);
//排序
void qwer_name(LinkList L);
//初始化链表
void init_list(LinkList L);
//链表长度
int getLength(LinkList L);
//统计性别
int sex_sum(LinkList L);
#endif
linklist.c
#include"test.h"
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//创建链表
LinkList list_create()
{
LinkList L=(LinkList)malloc(sizeof(Node));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=NULL;
printf("链表创建成功\n");
return L;
}
//申请结点封装数据函数
LinkList apply_node(int num,datatype* n,char s,datatype* ph)
{
LinkList p=(LinkList)malloc(sizeof(Node));
if(NULL==p)
{
printf("申请结点失败\n");
return NULL;
}
p->num=num;
strcpy(p->name,n);
p->sex=s;
strcpy(p->phone,ph);
p->next=NULL;
return p;
}
//判空
int list_empty(LinkList L)
{
return L->next==NULL;
}
//头插
int list_insert_head(LinkList L,int num,datatype* name,char sex,datatype* phone)
{
if(NULL==L)
{
printf("不合法\n");
return -1;
}
LinkList p=apply_node(num,name,sex,phone);
p->next=L->next;
L->next=p;
L->len++;
printf("插入成功\n");
return 0;
}
//遍历
void list_show(LinkList L)
{
if(NULL==L||list_empty(L))
{
printf("遍历失败\n");
return ;
}
LinkList q=L->next;
while(q!=NULL)
{
printf("%d\t",q->num);
printf("%s\t",q->name);
printf("%c\t",q->sex);
printf("%s\t",q->phone);
printf("\n");
q=q->next;
}
printf("遍历成功\n");
printf("\n");
return ;
}
//查找信息
void find_name(LinkList L,datatype* name)
{
if(NULL==L||list_empty(L))
{
printf("查找失败\n");
return;
}
LinkList q=L->next;
printf("信息如下:\n");
while(q!=NULL&&strcmp(q->name,name)!=0)
{
q=q->next;
}
if(NULL==q)
{
printf("查找失败\n");
}
else
{
printf("%d\t",q->num);
printf("%s\t",q->name);
printf("%c\t",q->sex);
printf("%s\t",q->phone);
}
printf("\n");
return ;
}
//修改信息
void updata_name(LinkList L,datatype* name,int new_num,datatype* new_name,char new_sex,datatype* new_phone)
{
if(NULL==L&&list_empty(L))
{
printf("链表不合法\n");
return;
}
LinkList p=L->next;
while(p!=NULL&&strcmp(p->name,name)!=0)
{
p=p->next;
}
if(NULL==p)
{
printf("查找失败\n");
}
else
{
p->num=new_num;
strcpy(p->name,new_name);
p->sex=new_sex;
strcpy(p->phone,new_phone);
}
return;
}
//按位置进行查找函数,返回找到的结点
int find_pos(LinkList L,datatype* name)
{
if(NULL==L||list_empty(L))
{
printf("查找失败\n");
return -1;
}
int pos=0;
LinkList q=L;
while(q!=NULL&&strcmp(q->name,name)!=0)
{
q=q->next;
pos++;
}
return pos;
}
//删除信息
void delete_name(LinkList L,datatype* name)
{
if(NULL==L||list_empty(L))
{
printf("删除失败\n");
return;
}
LinkList q=L;
int pos=find_pos(L,name);
for(int i=1;i<=pos-1;i++)
{
q=q->next;
}
LinkList p=q->next;
q->next=p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
return ;
}
//插入信息
void intsert_pos(LinkList L,int pos,int num,datatype* name,char sex,datatype* phone)
{
if(NULL==L||pos<1||pos>L->len+1)
{
printf("插入失败\n");
return;
}
LinkList p=apply_node(num,name,sex,phone);
LinkList q=L;
for(int i=1;i<pos;i++)
{
q=q->next;
}
p->next=q->next;
q->next=p;
L->len++;
printf("插入成功\n");
return;
}
//导出文件
void export_name(LinkList L)
{
if(NULL==L||list_empty(L))
{
printf("导出失败\n");
return;
}
LinkList p=L->next;
FILE *fp=fopen(".//account.txt","a+");
while(p!=NULL)
{
fprintf(fp,"%d\t%s\t%c\t%s\t\n",p->num,p->name,p->sex,p->phone);
p=p->next;
printf("\n");
}
printf("导入成功\n");
fclose(fp);
return ;
}
//排序
void qwer_name(LinkList L)
{
if(NULL==L||list_empty(L))
{
printf("排序失败\n");
return;
}
for(int i=1;i<L->len;i++)
{
LinkList p=L->next;
for(int j=0;j<L->len-i;j++)
{
if(strcmp(p->name,p->next->name)<0)
{
int temp=p->num;
p->num=p->next->num;
p->next->num=temp;
datatype temp_name[20];
strcpy(temp_name,p->name);
strcpy(p->name,p->next->name);
strcpy(p->next->name,temp_name);
char temp2=p->sex;
p->sex=p->next->sex;
p->next->sex=temp2;
datatype temp_phone[20];
strcpy(temp_phone,p->phone);
strcpy(p->phone,p->next->phone);
strcpy(p->next->phone,temp_phone);
}
p=p->next;
}
}
printf("排序成功\n");
return;
}
//初始化链表
void init_list(LinkList L)
{
if(NULL==L)
{
printf("失败\n");
return ;
}
LinkList p=L->next;
while(L!=NULL)
{
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
printf("删除成功\n");
return;
}
//链表长度
int getLength(LinkList L)
{
return L->len;
}
//统计性别
int sex_sum(LinkList L)
{
if(NULL==L||list_empty(L))
{
printf("查找失败\n");
return -1;
}
int sum=0;
LinkList q=L->next;
for(int i=1;i<=L->len;i++)
{
if(q->sex=='M')
{
sum++;
}
q=q->next;
}
printf("性别男的有%d个\n",sum);
printf("性别女的有%d个\n",L->len-sum);
return 0;
}
test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "test.h"
int main(int argc, const char *argv[])
{
int menu1;
char userName[20];
char pwd[20];
LinkList L=list_create();
if(NULL==L)
{
return -1;
}
while(1)
{
printf("\t\t===========员工登录========\n");
printf("\t\t1.注册信息\n");
printf("\t\t2.用户登录\n");
printf("\t\t0.退出\n");
printf("请输入功能选项:");
scanf("%d",&menu1);
switch(menu1)
{
case 1:
{
printf("请输入注册账号:");
scanf("%s",userName);
printf("请输入注册密码:");
scanf("%s",pwd);
if(strlen(pwd)<6)
{
printf("输入不合法,重新输入\n");
}
else
{
printf("注册成功\n");
}
}
FILE *fp=fopen(".//account.txt","a+");
break;
if(NULL==fp)
{
printf("文件打开失败\n");
return -1;
}
fprintf(fp,"%s %s\n",userName,pwd);
fclose(fp);
break;
case 2:
{
char name[20];
char password[20];
printf("请输入登录账号:");
scanf("%s",name);
printf("请输入密码:");
scanf("%s",password);
FILE *fp=fopen(".//account.txt","a+");
if(NULL==fp)
{
printf("文件打开失败\n");
return -1;
}
while(!feof(fp))
{
int f=0;
fscanf(fp,"%s%s",userName,pwd);
if(strcmp(userName,name)==0&&strcmp(pwd,password)==0)
{
printf("登陆成功\n");
printf("\t\t二级菜单\n");
//
//
while(1)
{
int f=0;
int menu2;
printf("\t\t请选择功能\n");
printf("\t\t1.创建模块\n");
printf("\t\t2.添加数据\n");
printf("\t\t3.查找信息\n");
printf("\t\t4.遍历\n");
printf("\t\t5.修改信息\n");
printf("\t\t6.删除信息\n");
printf("\t\t7.插入信息\n");
printf("\t\t8.导入信息到文件夹中\n");
printf("\t\t9.将信息排序\n");
printf("\t\t10.初始化链表\n");
printf("\t\t11.当前链表长度\n");
printf("\t\t12.查看男/女的数量\n");
printf("\t\t0.退出\n");
printf("请选择功能:");
scanf("%d",&menu2);
switch(menu2)
{
case 1:
{
}
case 2:
{
int num;
char name[20];
char sex;
char phone[20];
printf("请输入编号:");
scanf("%d",&num);
printf("请输入姓名:");
scanf("%s",name);
printf("请输入性别:");
scanf("%s",&sex);
printf("请输入手机号码:");
scanf("%s",phone);
list_insert_head(L, num,name,sex,phone);
break;
}
case 3:
{
char str[20];
// int num;
printf("请输入要查找的姓名\n");
scanf("%s",str);
find_name(L,str);
break;
}
case 4:
{
list_show(L);
break;
}
case 5:
{
int num;
char old_name[20];
char name[20];
char sex;
char phone[20];
printf("输入要修改的名字:");
scanf("%s",old_name);
printf("请输入新的编号:");
scanf("%d",&num);
printf("请输入新的姓名:");
scanf("%s",name);
printf("请输入新的性别:");
scanf("%s",&sex);
printf("请输入新手机号码:");
scanf("%s",phone);
updata_name(L,old_name,num,name,sex,phone);
break;
}
case 6:
{
char name[20];
printf("输入要删除的名字:");
scanf("%s",name);
delete_name(L,name);
break;
}
case 7:
{
int pos;
int num;
char name[20];
char sex;
char phone[20];
printf("输入要插入的位置:");
scanf("%d",&pos);
printf("请输入新的编号:");
scanf("%d",&num);
printf("请输入新的姓名:");
scanf("%s",name);
printf("请输入新的性别:");
scanf("%s",&sex);
printf("请输入新手机号码:");
scanf("%s",phone);
intsert_pos(L,pos,num,name,sex,phone);
break;
}
case 8:
{
if(NULL==L)
{
printf("导出失败\n");
return -1;
}
else
{
export_name(L);
}
break;
}
case 9:
{
if(NULL==L||list_empty(L))
{
printf("排序失败\n");
return -1;
}
else
{
qwer_name(L);
}
break;
}
case 10:
{
if(NULL==L||list_empty(L))
{
printf("删除失败\n");
}
else
{
init_list(L);
}
break;
}
case 11:
{
printf("当前链表长度为%d\n",getLength(L));
break;
}
case 12:
{
sex_sum(L);
break;
}
case 0:
{
f = 1;
}
}
if(f==1)
{
break;
}
}
}
}
printf("登录失败\n");
fclose(fp);
break;
}
case 0: exit(0);
}
}
return 0;
}