功能函数
#include "cs.h"
//创建链表
create cs_creat(){
create l=(create)malloc(sizeof(node));
if(l==NULL){
printf("创建链表失败\n");
return NULL;
}
l->id=0;
l->name[20]=0;
l->sex[20]=0;
l->num[15]=0;
l->next=NULL;
l->len=0;
printf("创建链表成功\n");
return l;
}
//申请节点封装数据
create cs_app_node(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return NULL;
}
create p=(create)malloc(sizeof(node));
if(p==NULL){
printf("申请节点失败\n");
return NULL;
}
p->id=q->id1;
strcpy(p->name,q->name1);
strcpy(p->sex,q->sex1);
strcpy(p->num,q->num1);
p->next=NULL;
p->len=0;
printf("申请节点成功\n");
return p;
}
//添加信息
void cs_add(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p=cs_app_node(l, q);
if(p==NULL){
printf("申请节点失败\n");
return ;
}
p->next=l->next;
l->next=p;
l->len++;
printf("添加人员信息成功\n");
return ;
}
//按姓名查找返回对应节点
create cs_find_name(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return NULL;
}
int falg=0;
create p=l->next;
//printf("2222222222222222222\n");
while(1){
if(strcmp(p->name,q->name1)==0){
falg=1;
break;
}
p=p->next;
if(p==NULL){
break;
}
}
if(falg==0){
printf("未查找到该姓名\n");
return NULL;
}
return p;
}
//修改信息
void cs_update(create l,create p,node1 q){
if(l==NULL||p==NULL){
printf("所给链表不合理\n");
return ;
}
printf("请按对应数字选择您要修改的信息\n");
while(1){
printf("1.编号\n");
printf("2.姓名\n");
printf("3.性别\n");
printf("4.电话\n");
printf("按0退出信息修改\n");
scanf("%d",&q->T);
switch(q->T){
case 1:
{
printf("请输入您要修改成的编号\n");
scanf("%d",&q->id1);
getchar();
p->id=q->id1;
printf("编号修改完成\n");
break;
}
case 2:
{
printf("请输入您要修改成的名字\n");
scanf("%s",q->name1);
getchar();
strcpy(p->name,q->name1);
printf("姓名修改完成\n");
break;
}
case 3:
{
printf("请输入您要修改成的性别\n");
scanf("%s",q->sex1);
getchar();
strcpy(p->sex,q->sex1);
printf("性别修改完成\n");
break;
}
case 4:
{
printf("请输入您要修改成的电话号\n");
scanf("%s",q->num1);
getchar();
strcpy(p->num,q->num1);
printf("电话号修改完成\n");
break;
}
case 0:
{
goto END;
}
default :
{
printf("输入格式有误\n");
break;
}
}
}
END:
return ;
}
//查找信息
void cs_find(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p=cs_find_name(l,q);
if(p==NULL){
return ;
}
printf(">>>已查找到改用户对应信息<<<");
printf(">>>该用户编号为%d\n",p->id);
printf(">>>该用户姓名为%s\n",p->name);
printf(">>>该用户性别为%s\n",p->sex);
printf(">>>该用户电话号为%s\n",p->num);
printf("查找该用户信息成功\n");
return ;
}
//按位置查找返回对应节点
create cs_pos_find(create l,int pos){
if(l==NULL||pos>l->len||pos<1){
printf("所给链表不合理\n");
return NULL;
}
create p=l;
for(int i=0;i<pos;i++){
p=p->next;
}
printf("查找对应节点成功\n");
return p;
}
//插入信息
int cs_insert(create l,node1 q,int pos){
if(l==NULL||pos<1||pos>l->len){
printf("所给链表不合理\n");
return 0;
}
create t=cs_app_node(l,q);
create p=cs_pos_find(l,pos-1);
t->next=p->next;
p->next=t;
printf("插入信息成功\n");
return 0;
}
//按姓名查找返回对应位置
int cs_find_name_pos(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return 0;
}
int falg=0;
int count=1;
create p=l->next;
//printf("2222222222222222222\n");
while(1){
if(strcmp(p->name,q->name1)==0){
falg=1;
break;
}
count++;
p=p->next;
if(p==NULL){
break;
}
}
if(falg==0){
printf("未查找到改姓名\n");
return 0;
}
return count;
}
//删除信息
void cs_delete(create l,node1 q){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
int pos=cs_find_name_pos(l,q);
create p=cs_pos_find(l,pos-1);
create t=p->next;
p->next=t->next;
free(t);
t=NULL;
printf("删除信息成功\n");
return ;
}
//展示信息
void cs_show(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p=l->next;
while(p!=NULL){
printf(">>>该用户编号为%d\n",p->id);
printf(">>>该用户姓名为%s\n",p->name);
printf(">>>该用户性别为%s\n",p->sex);
printf(">>>该用户电话号为%s\n",p->num);
p=p->next;
}
printf("联系人信息展示完成\n");
return ;
}
//导出信息
void cs_export(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
FILE* sfd=fopen(".//cs_t.txt","w");
if(sfd==NULL){
printf("文件打开失败\n");
return ;
}
create p=l->next;
while(p!=NULL){
fprintf(sfd,"%d %s %s %s\n",p->id,p->name,p->sex,p->num);
p=p->next;
}
fclose(sfd);
printf("信息导入完毕\n");
return ;
}
//按姓名将通讯录排序
void cs_sort(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p = l;
create q = p->next;
l->next = NULL;
while (q != NULL) {
l = p;
while (l->next != NULL && strcmp(l->next->name, q->name) > 0) {
l = l->next;
}
create t = q ->next;
q->next = l->next;
l->next = q;
q = t;
}
/* node1 f=(node1)malloc(sizeof(struct node1));
if(f==NULL){
printf("数据存储失败\n");
return ;
}
create p=l;
create q=p->next;
for(p=l->next;p!=NULL;p=p->next){
create T=p;
// printf("P = %p\n", p);
for(q=p->next;q!= NULL;q=q->next){
if(strcmp(T->name,q->name)>0){
T=q;
}
if(T!=q){
strcpy(p->name,T->name);
strcpy(p->sex,T->sex);
p->id=T->id;
strcpy(p->num,T->num);
}
}
}
*/
/* while(p!=NULL){
if(strcmp(p->name,q->name)>0){
create A=p;
create B=q;
if(l->next==A){
A->next=B->next;
B->next=A;
l->next=B;
}else{
A->next=B->next;
strcpy(f->name1,A->name);
int pos=cs_find_name_pos(l,f);
create T=cs_pos_find(l,pos-1);
B->next=A;
T->next=B;
}
}
p=p->next;
q=q->next;
if(q==NULL){
break;
}
}
*/
printf("按姓名排序完成\n");
return ;
}
//返回上一级菜单
void cs_return(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
printf("返回上一级菜单成功\n");
return ;
}
//初始化链表
void cs_into(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p=l->next;
create q=p;
while(p!=NULL){
l->next=p->next;
free(q);
q=NULL;
p=p->next;
q=p;
}
printf("初始化链表完成\n");
return ;
}
//获取链表长度
int cs_getlength(create l){
if(l==NULL){
printf("所给链表不合理\n");
return 0;
}
return l->len;
}
//统计性别
void cs_statistical_sex(create l){
if(l==NULL){
printf("所给链表不合理\n");
return ;
}
create p=l->next;
int count=0;
int count1=0;
while(p!=NULL){
if(strcmp(p->sex,"nan")==0){
count++;
}else if(strcmp(p->sex,"nv")==0){
count1++;
}
p=p->next;
}
printf("统计完毕男生有%d个,女生有%d个\n",count,count1);
return ;
}
//将文件中的信息导入到链表中
void cs_export_lb(create l,node1 p){
if(l==NULL||p==NULL){
printf("所给链表不合理\n");
return ;
}
FILE* sfd=fopen(".//cs_t.txt","r");
if(sfd==NULL){
printf("文件打开失败\n");
return ;
}
while(1){
//bzero(p, sizeof(struct node1));
int res = fscanf(sfd,"%d %s %s %s",&p->id1,p->name1,p->sex1,p->num1);
printf("%d\n", res);
if(res != -1)
{
create q=cs_app_node(l,p);
q->next=l->next;
l->next=q;
}else
{
break;
}
}
printf("文件导入完成\n");
return ;
}
这里插入代码片
//主函数
#include "cs.h"
int main(int argc, const char *argv[])
{
int data;
char name[20];
char passwd[20];
while(1){
TTD :
printf("*****>>>通讯登录系统<<<*****\n");
printf("*****>>>1.注册<<<*****\n");
printf("*****>>>2.登录<<<*****\n");
printf("*****>>>3.退出<<<*****\n");
printf("欢迎使用本系统,请选择您要执行的功能\n");
scanf("%d",&data);
switch(data){
case 1:
{
while(1){
printf("请输入要注册的用户名\n");
scanf("%s",name);
printf("请输入要注册的密码\n");
scanf("%s",passwd);
if(strlen(passwd)<6){
printf("请输入至少大于六位数的密码\n");
}else{
printf("注册成功\n");
break;
}
}
FILE* sfd=fopen(".//cs.txt","a+");
if(sfd==NULL){
printf("打开文件失败\n");
return 0;
}
fprintf(sfd,"%s %s\n",name,passwd);
fclose(sfd);
}
break;
case 2:
{
int sd;
char fname[20];
char fpasswd[20];
printf("请输入用户名\n");
scanf("%s",fname);
printf("请输入密码\n");
scanf("%s",fpasswd);
FILE* sfd=fopen(".//cs.txt","r");
if(sfd==NULL){
printf("文件打开失败\n");
return 0;
}
while(!feof(sfd)){
fscanf(sfd,"%s%s",name,passwd);
if(strcmp(fname,name)==0&&strcmp(passwd,fpasswd)==0){
printf("登录成功\n");
printf("成功激活二级菜单\n");
create l=cs_creat();
if(l==NULL){
printf("链表创建失败\n");
return 0;
}
while(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("*****>>>8.导出信息<<<*****\n");
printf("*****>>>9.按姓名将通讯录排序<<<*****\n");
printf("*****>>>10.返回上一级菜单<<<*****\n");
printf("*****>>>11.初始化链表<<<*****\n");
printf("*****>>>12.获取链表长度<<<*****\n");
printf("*****>>>13.统计性别<<<*****\n");
printf("*****>>>14.将文件中的信息导入到链表中<<<*****\n");
printf("欢迎使用本系统,请选择您要执行的功能\n");
printf("若未选择过功能1,请先选择功能1,否者将无法执行下列操作\n");
scanf("%d",&sd);
switch(sd){
case 1:
{
printf("已选用功能1\n");
}
break;
case 2:
{
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
printf("请输入联系人的编号\n");
scanf("%d",&q->id1);
getchar();
printf("请输入联系人的用户名\n");
scanf("%s",q->name1);
getchar();
printf("请输入联系人的性别\n");
scanf("%s",q->sex1);
getchar();
printf("请输入联系人的电话\n");
scanf("%s",q->num1);
getchar();
cs_add(l,q);
break;
}
case 3:
{
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
printf("请输入要修改信息的联系人姓名\n");
scanf("%s",q->name1);
getchar();
create p=cs_find_name(l,q);
cs_update(l,p,q);
break;
}
case 4:
{
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
printf("请输入要查找联系人的姓名\n");
scanf("%s",q->name1);
cs_find(l,q);
break;
}
case 5:
{
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
printf("请输入要删除的联系人姓名\n");
scanf("%s",q->name1);
getchar();
cs_delete(l,q);
break;
}
case 6:
{
int pos;
printf("请输入要插入的位置\n");
scanf("%d",&pos);
getchar();
printf("请输入要插入的信息:\n");
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
printf("请输入联系人的编号\n");
scanf("%d",&q->id1);
getchar();
printf("请输入联系人的用户名\n");
scanf("%s",q->name1);
getchar();
printf("请输入联系人的性别\n");
scanf("%s",q->sex1);
getchar();
printf("请输入联系人的电话\n");
scanf("%s",q->num1);
getchar();
cs_insert(l,q,pos);
break;
}
case 7:
{
cs_show(l);
break;
}
case 8:
{
cs_export(l);
break;
}
case 9:
{
cs_sort(l);
break;
}
case 10:
{
cs_return(l);
goto TTD;
break;
}
case 11:
{
cs_into(l);
break;
}
case 12:
{
int sap=cs_getlength(l);
printf("链表长度为%d\n",sap);
break;
}
case 13:
{
cs_statistical_sex(l);
break;
}
case 14:
{
node1 q=(node1)malloc(sizeof(struct node1));
if(q==NULL){
printf("数据存储失败\n");
return 0;
}
cs_export_lb(l,q);
break;
}
default :
{
printf("输入格式有误,请重新输入\n");
break;
}
}
}
}else{
printf("用户名或密码错误登录失败\n");
break;
}
}
fclose(sfd);
}
case 3:
{
goto CPP;
}
}
}
CPP :
return 0;
}
//头文件
#ifndef __CS_H__
#define __CS_H__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef char datatype;
typedef struct node{
int len;//记录长度
int id;//编号
datatype name[20];//姓名
char sex[20];//性别
char num[15];//电话
struct node* next;//指向下个节点的指针
}*create,node;
typedef struct node1{
int T;
int id1;
char name1[20],sex1[20],num1[20];
}*node1;
//创建链表
create cs_creat();
//申请节点封装数据
create cs_app_node(create l,node1 q);
//添加信息
void cs_add(create l,node1 q);
//修改信息
void cs_update(create l,create p,node1 q);
//按姓名查找返回对应节点
create cs_find_name(create l,node1 q);
//查找信息
void cs_find(create l,node1 q);
//按位置查找返回对应节点
create cs_pos_find(create l,int pos);
//按姓名查找返回对应位置
int cs_find_name_pos(create l,node1 q);
//删除信息
void cs_delete(create l,node1 q);
//插入信息
int cs_insert(create l,node1 q,int pos);
//展示信息
void cs_show(create l);
//导出信息
void cs_export(create l);
//按姓名将通讯录排序
void cs_sort(create l);
//返回上一级菜单
void cs_return(create l);
//初始化链表
void cs_into(create l);
//获取链表长度
int cs_getlength(create l);
//统计性别
void cs_statistical_sex(create l);
//将文件中的信息导入到链表中
void cs_export_lb(create l,node1 p);
#endif