项目:基于链表的通信录管理 意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度 模块: 一级菜单内

功能函数

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值