数据结构课程设计—通讯录管理系统

/**************************** 
*版权所有  (C)2016.ccx 

*文件名称:   ccx.cpp 
*文件标识:   无 
*内容摘要:   该项目的所有函数的实现 
*其他说明:   无 
*当前版本:   V1.0 
*作   者:    郗传秀
*完成日期:   20161225 

*修改记录:   6 
*修改日期:   20161229 
*版本号:     V1.0 
*修改人:     郗传秀 
*修改内容: 

********************************************************************/  

#include"ccx.h"

void choose();//主菜单
void searchmenu();//查询菜单
void add();//添加新纪录   添加新用户
void searchna();//按条件(姓名)搜索记录
void display();//显示全部记录
void load();//载入文件内容
void save();//写入文件
void del();//删除记录
void listinsert();//插入结点函数
void bianji();//编辑
void dial();//拨号


/***********************主函数************************************/
/***********************************************************
*功能描述:  主函数
*输入参数:   无
*输出参数:   无
*返回值:     无
*************************************************************/
int main() //主函数
{
	load();
	listinsert();
	while (1)
		choose(); //进入主菜单,有非法输入仍停留在主菜单
    return 0;
}
/***********************主函数************************************/

/***********************load函数*****************************/
/***********************************************************
*功能描述:  装载导入文件
*输入参数:   无
*输出参数:   无
*返回值:     无
*************************************************************/
void load()//装载已有文件信息
{
	if((fp=fopen("txl.txt","rb"))==NULL)
	{
		printf("\n\t\t通讯录文件不存在");
		if ((fp=fopen("txl.txt","wb"))==NULL)
		{
			printf("\n\t\t建立失败");
			exit(0);
		{
			printf("\n\t\t通讯录文件已建立");
			printf("\n\t\t按任意键进入主菜单");
			getch();
        }

		}else
			return;
	exit(0);
	}
	//导入文件功能部分
	fseek(fp,0,2);
	if (ftell(fp)>0)
	{
		rewind(fp);
		for(len=0;!feof(fp)&&fread(&yong[len],sizeof(struct yonghu),1,fp);len++);
		printf("\n\t\t文件导入成功");
		printf("\n\t\t按任意键返回主菜单");
		getch();
		return;
	}
	printf("\n\t\t文件导入成功");
	printf("\n\t\t通讯录文件中无任何纪录");
	printf("\n\t\t按任意键返回主菜单");
	getch();
	return;
}

void listinsert()//增加新结点
{
	linklist s,p=l;
	for(int i=0;i<len;i++)
	{
		s=(linklist)malloc(sizeof(pnode));
        strcpy(s->data.name,yong[i].name);
        strcpy(s->data.fm,yong[i].fm);
        strcpy(s->data.addr,yong[i].addr);
        strcpy(s->data.tel,yong[i].tel);
        strcpy(s->data.group,yong[i].group);
        strcpy(s->data.kuaijie,yong[i].kuaijie);
        s->data.tms=yong[i].tms;
	     if(head==NULL)   //若为空,则建立新节点//
            {
                head=s;
                r=head;
                head->next=NULL;
            }
            else         //否则,插入节点尾插法
            {
                r->next=s;
                r=s;
                r->next=NULL;
            }///
	}
}



/*********************主菜单界面********************************/
/***********************************************************
*功能描述:  提供选择界面
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*************************************************************/
void choose()//主菜单
{
	char ch;
	system("cls");
	printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
	printf("\n\t\t***************欢迎进入通讯录系统***************");
	printf("\n\t\t******************1-新添纪录     ***************");
	printf("\n\t\t******************2-查找联系人   ***************");
	printf("\n\t\t******************3-删除联系人   ***************");
	printf("\n\t\t******************4-保存         ***************");
        printf("\n\t\t******************5-退出         ***************");
        printf("\n\t\t******************6-编辑         ***************");
        printf("\n\t\t******************7-拨号         ***************");
        printf("\n\t\t******************7-发送信息     ***************");
        printf("\n\t\t************************************************");
        printf("\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
	printf("\n\t\t请选择:");
	printf("%c ",ch=getch());
	switch (ch)
	{
	case '1':add();break;
	case '2':searchmenu();break;
	case '3':del();break;
	case '4':save();break;
	case '5':exit(0);
	case '6':bianji();break;
	case '7':dial();break;
	default:choose();
	}
}
/*********************主菜单界面********************************/

/***********************************************************
*功能描述:  添加新用户
*输入参数:   新用户信息
*输出参数:   无
*返回值:     无
*************************************************************/
void add()//添加新纪录
{
    int x;
    int a=0,i,findmark;
	l=(linklist)malloc(sizeof(pnode));    //建立头节点
	printf("\n\t\t**************** 请输入用户信息 ****************\n");
	printf("\n\t\t姓名:");
	scanf("%s",&yong[len].name);
	printf("\n\t\t性别:");
	scanf("%s",&yong[len].fm);
                printf("\n\t\t地址:");
                scanf("%s",&yong[len].addr);
	            printf("\n\t\t联系方式:");
	            scanf("%s",&yong[len].tel);
	            printf("\n\t\t分组:");
	            scanf("%s",&yong[len].group);
	            printf("\n\t\t快捷键:");
	            scanf("%s",&yong[len].kuaijie);
	            len++;
	            printf("\n\t\t==============新用户添加成功=============================\n");
	            printf("\n\t\t=============是否继续添加新用户==========================\n");
	            printf("\n\t\t======继续添加请选1      返回主界面请选2=============\n");
	            scanf("%d",&x);
	            if(x==1)
                    {
                        add();
                    }
                if(x==2)
                    {
                        choose();
                    }
}
/***********************************************************
*功能描述:  查询选择菜单
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*************************************************************/
void searchmenu()//查询菜单
{
	char ch;
	system("cls");
	printf("\n\t\t=================查询菜单 =======================");
	printf("\n\t\t================1-显示所有记录===================");
	printf("\n\t\t================2-按姓名查询=====================");
	printf("\n\t\t================3-返回主菜单=====================");
	printf("\n\t\t=================================================");
	printf("\n\t\t请选择:");
	printf("%c",ch=getch());
	switch (ch)
	{
	case '1':display();break;
	case '2':searchna();break;
	case '3':choose();break;
	}
}
/***********************************************************
*功能描述:  按照输入的用户姓名进行查找
*输入参数:   用户姓名
*输出参数:   用户所有信息
*返回值:     无
*************************************************************/
void searchna()查找按姓名
{
	printf("\n\t\t======================按姓名查找 =============================");
	char name[20];
	printf("\n\t\t请输入姓名:");
	scanf("%s",name);
	printf(" \n\t\t查询到的信息:\n");
	printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");//格式控制输出
	printf(" -----------------------------------------------------------------------------\n");
		for (int i=0;i<len;i++)
		{
			if(strcmp(name,yong[i].name)==0)
				printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);
			if (i+1<len) continue;//重名纪录再检索
		}
	printf(" -----------------------------------------------------------------------------\n");
	printf("\n\t\t按任意键返回查询菜单");
	getch();
	searchmenu();
}
/***********************************************************
*功能描述:  显示此通讯录总所有用户的信息
*输入参数:   无
*输出参数:   所有用户信息
*返回值:     无
*************************************************************/
void display()//显示所有纪录
{
	int i;
	system("cls");
	if(len!=0)
	{
		printf("\n\t\t=================== 以下为通讯录所有信息=====================\n\n");
		printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");
		printf(" -----------------------------------------------------------------------------\n");
		for (i=0;i<len;i++)
		{
			printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);
			if (i+1<len) continue;
		}
		printf(" -----------------------------------------------------------------------------\n");
	}
	else
		printf("\n\t\t通讯录中无任何纪录");
	printf("\n\t\t按任意键返回查询菜单:");
	getch();
	searchmenu();
}


/***********************************************************
*功能描述:  查找到要删除的用户,进行删除,进行同名检索
*输入参数:   用户姓名
*输出参数:   无
*返回值:     无
*************************************************************/
void del() //删除纪录
{
    int ch;
	int a=0,i,j,findmark; //findmark为查找结果标志
 //   int findmark=0,delmark=0;
    char name[20];
    printf("\n\t\t请输入要删除学生姓名:");
    scanf("%s",name);
	for (i=a;i<len;i++)
	{
		if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录
		{
//			findmark++;
			printf("\n\t\t以下是您要删除的用户记录:\n");
			printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");
			printf(" -----------------------------------------------------------------------------\n");
			printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);
			printf(" -----------------------------------------------------------------------------\n");
			printf("\n\t\t是否删除?(y/n)");
			if (getch()=='y')
			{
				for (j=i;j<len-1;j++)
					yong[j]=yong[j+1];
				len--;
				i--;
//				delmark++;
				printf("\n\t\t删除成功");
				if((i+1)<len)
				{
					printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)\n"); //是否删除同名纪录
					if (getch()=='y')
					{
						a=i;
						continue; //删除上一条记录之后搜索是否有同名纪录
					}
					else
                    {
                        printf("返回主界面");
                        Sleep(3000);
                        choose();
                    }
				}
			} //endif
			if((i+1)<len)
			{
				printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)\n"); //不删前一条纪录,删当前纪录
				if (getch()=='y')
				{
					a=i;
					continue;
				}
				else
                {
                    printf("返回主界面");
                    Sleep(2000);
                    choose();
                }
			}
		} //endif
		else
			continue;
	} //endfor



	if(!findmark)//没有找到任何符合条件的记录  输入为注册过的用户时
		printf("\n\t\t没有符合条件的记录!");


	printf("\n\t\t继续删除请按1     返回主界面请按2  \n"); //无同名纪录,是否继续删除其他纪录
	scanf("%d",&ch);
	if (ch==1)
		del();
    if(ch==2)
        Sleep(3000);
        choose();//继续删除其他纪录
}



/***********************************************************
*功能描述:  将操作完成后的信息存储到文件
*输入参数:  无
*输出参数:   无
*返回值:     无
*************************************************************/
void save()//写入文件//将文件存起来下次打开可看
{
	int i;
	if ((fp=fopen("txl.txt","wb"))==NULL)
	{
		printf("\n\t\t文件打开失败");
	}
	for (i=0;i<len;i++)
	{
		if (fwrite(&yong[i],sizeof(struct yonghu),1,fp)!=1)
			printf("\n\t\t写入文件错误!\n");
	}
	fclose(fp); //关闭文件指针
	printf("\n\t\t通讯录文件已保存,按任意键继续...");
	getch();
	return;
}

/***********************************************************
*功能描述:  对已存在的用户进行编辑
*输入参数:  用户姓名
*输出参数:   无
*返回值:     无
*************************************************************/
void bianji()//编辑
{


    int ch,xuan;
    pnode *s;
	int a=0,i,j,findmark; //findmark为查找结果标志
    char name[20];
    printf("\n\t\t请输入要编辑的用户姓名:");
    scanf("%s",name);
	for (i=a;i<len;i++)
	{
		if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录
		{

			printf("\n\t\t以下是您要改变的用户记录:\n");
			printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");
			printf(" -----------------------------------------------------------------------------\n");
			printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);
			printf(" -----------------------------------------------------------------------------\n");
			printf("\n\t\t是否改变?(y/n)");
			if (getch()=='y')
			{
			    printf("\n\t\t===============================================\n");
			    printf("\n\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
			    printf("\n\t\t请选择要编辑的内容\n");
                printf("\n\t\t编辑姓名请选择1       编辑地址请选择2\n");
			    printf("\n\t\t编辑联系方式请选择3       编辑分组请选择4\n");
			    printf("\n\t\t编辑快捷键请选择5\n");
			    printf("\n\t\t请输入要改变的内容\n");
			    printf("\n\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
			    printf("\n\t\t===============================================\n");
			    scanf("%d",&xuan);
			    if(xuan==1)
                {
                    printf("请输入新用户名\n");
                    scanf("%s",&s->data.name);
                    strcpy(yong[i].name,s->data.name);
                }
                if(xuan==2)
                {
                    printf("请输入新用户地址\n");
                    scanf("%s",&s->data.addr);
                    strcpy(yong[i].addr,s->data.addr);
                }
                if(xuan==3)
                {
                    printf("请输入新联系方式\n");
                    scanf("%s",&s->data.tel);
                    strcpy(yong[i].tel,s->data.tel);
                }
                if(xuan==4)
                {
                    printf("请输入新用户分组\n");
                    scanf("%s",&s->data.group);
                    strcpy(yong[i].group,s->data.group);
                }
                if(xuan==5)
                {
                    printf("请输入新用户快捷键\n");
                    scanf("%s",&s->data.kuaijie);
                    strcpy(yong[i].kuaijie,s->data.kuaijie);
                }
				printf("\n\t\t编辑成功");

			} //endif
		} //endif
		else
			continue;
	} //endfor



	if(!findmark)//没有找到任何符合条件的记录  输入为注册过的用户时
		printf("\n\t\t没有其他符合条件的记录!");


	printf("\n\t\t继续编辑请按1     返回主界面请按2  \n"); //无同名纪录,是否继续删除其他纪录
	scanf("%d",&ch);
	if (ch==1)
		bianji();
    if(ch==2)
        Sleep(3000);
        choose();//继续删除其他纪录

}







/***********************************************************
*功能描述:  拨号或者发送信息
*输入参数:  选择键,姓名,快捷键
*输出参数:   tms
*返回值:     无
*************************************************************/
void dial()       //拨号功能
{
    int c,choic;
	int ch,xuan;
    int r;
    pnode *p;
	pnode *s;
	int a=0,i,j,findmark; //findmark为查找结果标志
    char name[20];
    char b[20];
    printf("         \n");
    printf("+------------------------------------------------+\n");
    printf("\n\t\t   请按要求输入您的选择\n");
    printf("+     使用用户姓名联系请按(1)    使用快捷键联系请按(2)   +\n");  //两种拨号方式
    printf("+----------------------------------------------+\n");
    scanf("%d",&r);
    p=head;
    if(r==1)
    {
        printf("                    请输入联系用户的姓名:\n");
        scanf("%s",name);
		for (i=a;i<len;i++)
		{
			if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录
			{
				printf("\n\t\t呼叫此用户请按1,发送信息到此用户请按2\n");
				int v;
				scanf("%d",&v);
            if(v==1)
            {
                 printf("+----------------------------------------------+\n");
            printf("        loding------                           \n");
            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
            {
                Sleep(100);
                printf("■■");
            }
            printf("                                               \n");
            printf("                                               \n");
            Sleep(1000);
            printf("\n\t\t此用户联系方式为:%s\n",yong[i].tel);
            yong[i].tms=yong[i].tms+1;
            printf("\n\t\t+----------------------------------------------+\n");
            printf("\n\t\t拨打次数:    %d",yong[i].tms);
            printf("\n\t\t+----------------------------------------------+\n");
            printf("\n\t\t稍后返回主界面\n");
            Sleep(3000);
            }
            if(v==2)
            {
                printf("\n\t\t\=========\n");
                char neirong[200];
                printf("\n\t\t请输入要发送的内容\n");
                scanf("%s",neirong);
                printf("\n\t\t发送中......\n");
                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
                {
                    Sleep(100);
                    printf("■■");
                }

                printf("\n\t\t发送成功\n");
                Sleep(1000);
                printf("\n\t\t稍后返回主界面\n");
                Sleep(3000);

            }
		}
	}
	if(!findmark)
    {
        printf("\n\t\t没有符合条件的记录!");
        Sleep(1000);
    }

	}

	else
	{

    printf("\n\t\t请输入要编辑的用户快捷键:");
     scanf("%s",&b);
	for (i=a;i<len;i++)
	{
		if (findmark=strcmp(yong[i].kuaijie,b)==NULL) //找到一条符合条件的记录
		{  printf("呼叫此用户请按1,发送信息到此用户请按2");
            int v;
            scanf("%d",&v);
            if(v==1)
            {
                 printf("+----------------------------------------------+\n");
            printf("        loding------                           \n");
            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
            {
                Sleep(100);
                printf("■■");
            }
            printf("                                               \n");
            printf("                                               \n");
            Sleep(2000);
            printf("%s\n",yong[i].tel);
            yong[i].tms=yong[i].tms+1;
            printf("\n\t\t+----------------------------------------------+\n");
            printf("拨打次数:    %d",yong[i].tms);
            printf("\n\t\t+----------------------------------------------+\n");
            printf("\n\t\t稍后返回主界面\n");
            Sleep(3000);

            }
            if(v==2)
            {
                printf("\n\t\t\=========\n");
                char neirong[200];
                printf("\n\t\t请输入要发送的内容\n");
                scanf("%s",neirong);
                printf("\n\t\t发送中......\n");
                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
                {
                    Sleep(100);
                    printf("■■");
                }

                printf("\n\t\t发送成功\n");
                Sleep(1000);
                printf("\n\t\t稍后返回主界面\n");
                Sleep(3000);

            }
		}
	}
	if(!findmark)
    {
        printf("\n\t\t没有符合条件的记录!");
        Sleep(1000);
    }//没有找到任何符合条件的记录  输入为注册过的用户时




    }
}



/*void dial()       //拨号功能
{
    int c,choic;
    int a;
    pnode *p;
    char name[10];
    char b[20];
    printf("         \n");
    printf("+------------------------------------------------+\n");
    printf("\n\t\t   请按要求输入您的选择\n");
    printf("+     使用用户姓名联系请按(1)    使用快捷键联系请按(2)   +\n");  //两种拨号方式
    printf("+----------------------------------------------+\n");
    scanf("%d",&a);
    p=head;
    if(a==1)
    {
        printf("                    请输入联系用户的姓名:\n");
        scanf("%s",name);
        while(strcmp(name,p->data.name)!=0&&p!=NULL)//进行查找   查找用户名为name的用户
            p=p->next;
        if(p==NULL)//用户不存在
        {
            printf("+----------------------------------------------+\n");
            printf("                 您选择的用户不存在!\n");
            printf("+----------------------------------------------+\n");
            printf("+       重新输入请按(1)    返回主菜单(2)        +\n");
            printf("+----------------------------------------------+\n");
            scanf("%d",&choic);
            if(choic==1)
            {
                system("cls");
                dial();
            }
            if(choic==2)
            {
                system("cls");
                choose();
            }
        }
        else//找到此用户  名为name
        {
            printf("呼叫此用户请按1,发送信息到此用户请按2");
            int v;
            scanf("%d",&v);
            if(v==1)
            {
                 printf("+----------------------------------------------+\n");
            printf("        loding------                           \n");
            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
            {
                Sleep(100);
                printf("■■");
            }
            printf("                                               \n");
            printf("                                               \n");
            Sleep(2000);
            printf("%s\n",&p->data.tel);
            p->data.tms=p->data.tms+1;
            printf("+----------------------------------------------+\n");
            printf("拨打次数:    %d",p->data.tms);
            printf("+----------------------------------------------+\n");
            printf("\n\t\t稍后返回主界面\n");
            Sleep(5000);

            }
            if(v==2)
            {
                printf("\n\t\t\=========\n");
                char neirong[200];
                printf("\n\t\t请输入要发送的内容\n");
                scanf("%s",neirong);
                printf("\n\t\t发送中......\n");
                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
                {
                    Sleep(100);
                    printf("■■");
                }

                printf("\n\t\t发送成功\n");
                Sleep(2000);
                printf("\n\t\t稍后返回主界面\n");
                Sleep(5000);

            }

        }
    }
    else
    {
        printf("\n\t\t请输入快捷键号码:\n");
        scanf("%s",&b);
        while(p!=NULL&&strcmp(b,p->data.kuaijie)!=0)                   //遍历链表比较查询   遍历查询  利用快捷键
            p=p->next;
        if(p==NULL)
        {
            printf("\n\t\t   您输入的单键号码不存在!\n");
            printf("\n\t\t+----------------------------------------------+\n");
            printf("\n\t\t+      重新输入请按(1)    返回主菜单(2)        +\n");
            printf("\n\t\t+----------------------------------------------+\n");
            scanf("%d",&choic);
            if(choic==1)
            {
                dial();
            }
            if(choic==2)
            {
                Sleep(2000);
                system("cls");
                choose();
            }
        }
        else
        {


            printf("呼叫此用户请按1,发送信息到此用户请按2");
            int v;
            scanf("%d",&v);
            if(v==1)
            {
                             printf("                                               \n");
            printf("        loding------                                        \n");
            for(int j=0; j<20; j++)
            {
                Sleep(100);
                printf("■■");
            }
             printf("                                               \n");
             printf("                                               \n");
            Sleep(5000);
            printf("%s\n",p->data.name);
            printf("%s\n",p->data.tel);
            p->data.tms=p->data.tms+1;
            printf("\n\t\t+----------------------------------------------+\n");
            printf("拨打次数:    %d",p->data.tms);                  //显示拨打次数
            printf("\n\t\t+----------------------------------------------+\n");
            printf("\n\t\t稍后回到主界面\n");
            Sleep(5000);
            }
            if(v==2)
            {
                printf("\n\t\t=============\n");
                char neirong[200];
                printf("\n\t\t请输入要发送的内容\n");
                scanf("%s",neirong);
                printf("\n\t\t发送中......\n");
                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
                {
                    Sleep(100);
                    printf("■■");
                }

                printf("\n\t\t发送成功\n");
                Sleep(2000);
                printf("\n\t\t稍后返回主界面\n");
                Sleep(5000);

            }


        }
    }
}*/







头文件
ccx.h
#ifndef CCX_H_INCLUDED
#define CCX_H_INCLUDED


#include <stdio.h>
#include<iostream>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
#include <conio.h>
#define maxl 1000
struct yonghu
{
char name[20];//姓名
char fm[20];//性别
char addr[20];//地址
char tel[20];//联系方式
char group[20]; //分组
char kuaijie[20];//快捷键
int tms;//拨打次数
}yong[maxl];//1000个记录,可修改

struct pnode
{
	yonghu data;
	struct pnode *next/*, *prior*/;//双循环链表
};
typedef  pnode * linklist;

linklist head=NULL,r=NULL;   //初始化链表   单链表
linklist l;
int len=0;//链表长度
FILE *fp; //文件指针
#endif // CCX_H_INCLUDED



运行结果
主界面




新添记录

查询


删除

编辑



拨号/发送信息







设计心得:
利用了单链表,将每个独立的用户已一个个节点的形式连到一起,在基本的“增删改查”中加入了退出、保存以及拨号和发送信息界面
讲头文件与cpp文件链接运行,实现以上功能

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构 课程设计 void main() { list *head=NULL;//头指针初始化 FILE *fp;//定义文件指针 int m;//功能代号吗 do{ printf("\n #############################请选择################################\n"); printf(" # 1、信息输入 "); printf(" 2、显示信息 #\n"); printf(" # 3、查找姓名 "); printf(" 4、删除信息 #\n"); printf(" # 5、修改信息 "); printf(" 6、打开通讯录 #\n"); printf(" # 7、添加信息 "); printf(" 8、 保存 #\n"); printf(" # 9、清屏 "); printf(" 0、退出 #"); printf("\n ###################################################################\n"); printf(" 提示:信息输入和添加信息时最好存入字符,否则,在打开存储文件时,可能会出现乱码!\n"); printf("==输入要执行的功能代号:_"); scanf("%d",&m); switch(m) { case 1:enter(head);break; case 2:display(head); break; case 3:search(head); break; case 4:delete_name(head);break; case 5:change(head);break; case 6:load(head);break; case 7:insert(head);break; case 8:save(head,fp);printf("==保存成功==\n");break; case 9:system("cls");break; } } while(m!=0); } 2、信息输入: void enter(list *&head) { list *p0,*p1,*p2;//定义指针 int m;//作为判断是否继续新建的条件 FILE *fp; p0=(list *)malloc(LEN); //开辟一个新单元 p0->next=NULL;//结点指针域为空 head=p0;//第一个结点,即为头结点 printf("请输入信息建立通讯录:\n"); getchar(); scanfdata(p0);//输入数据 p2=p0; printf("是否继续按1输入,按0结束_"); scanf("%d",&m); while(m) { getchar(); p1=(list *)malloc(LEN); //开辟一个新单元 p1->next=NULL; p2->next=p1; scanfdata(p1);//输入数据 p2=p1; head->n = head->n+1;//表长 printf("是否继续按1输入,按0结束_"); scanf("%d",&m); } if(m==0) { save(head,fp);//把信息存到相应文件 } } 3、显示信息 void display(list *head) { list *p; //定义移动指针 int i; char *menu[]={"姓名","城市","电话", "QQ"}; p=head; printf("--------------------------------------------------------------------\n"); for(i=0;i<4;i++) printf("%-20s",menu[i]); printf("\n"); if (head!=N
通讯录管理系统可以使用哈希表来实现快速的电话号码查找。下面是一个简单的示例代码,演示了如何使用哈希表来实现通讯录管理系统: ```python class Contact: def __init__(self, phone_number, username, address): self.phone_number = phone_number self.username = username self.address = address class HashTable: def __init__(self): self.table = {} def insert(self, contact): key = contact.phone_number if key not in self.table: self.table[key] = contact def search_by_phone_number(self, phone_number): if phone_number in self.table: return self.table[phone_number] else: return None def search_by_username(self, username): for contact in self.table.values(): if contact.username == username: return contact return None # 创建哈希表 phone_number_table = HashTable() username_table = HashTable() # 从文件中读取记录并插入哈希表 with open('contacts.txt', 'r') as file: for line in file: phone_number, username, address = line.strip().split(',') contact = Contact(phone_number, username, address) phone_number_table.insert(contact) username_table.insert(contact) # 根据电话号码查找联系人 phone_number = '1234567890' contact = phone_number_table.search_by_phone_number(phone_number) if contact: print(f"Contact found - Phone Number: {contact.phone_number}, Username: {contact.username}, Address: {contact.address}") else: print("Contact not found") # 根据用户名查找联系人 username = 'John Doe' contact = username_table.search_by_username(username) if contact: print(f"Contact found - Phone Number: {contact.phone_number}, Username: {contact.username}, Address: {contact.address}") else: print("Contact not found") ``` 这个示例代码中,我们定义了一个Contact类来表示每个联系人的信息。然后,我们创建了两个哈希表,一个以电话号码为关键字,另一个以用户名为关键字。我们从文件中读取记录,并将每个记录插入到两个哈希表中。最后,我们可以根据电话号码或用户名来查找联系人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值