小小项目:1简易通讯录

今天做了个项目,第一次,问题可能比较多。

写的也比较不规范,以后经量该。


先是头文件

#ifndef __LinkList_H__
#define __LinkList_H__

#define FALSE -1
#define TRUE 0

typedef struct LinkData           //结构体存数据
{
	int id;
	char name[15];
	char phone_num[15];
	char house[30];
	char telephone[10];
}LinkData;

typedef struct _node              //声明链表
{
	LinkData data;
	struct _node *next;
}NODE;

// 创建链表
NODE * Create_List();

// 插入元素:尾插
int Insert_Last(NODE* h,LinkData data);





// 求链表长度:通过函数返回值返回
int Get_Len(NODE* h);

// 清空所有结点
int Clean_List(NODE* h);

// 销毁链表
int Destroy(NODE* h);

//主菜单
void menu(NODE* h);

//命令一:添加通讯录
void add_address_list(NODE* h);

//命令二:排序显示(按照ID排序)
void Risplay_Id(NODE* h);

//显示通讯录
void Risplay(NODE* h);

//命令三:搜索好友
void Find_friend(NODE* h);

//搜索好友:按名字搜索(只能搜索第一个)
void  Find_name(NODE* tmp,char *data,int x);

//命令四:删除好友
void  Del_name_id(NODE* h);

// 删除元素:根据名字删除指定数据(只能删除第一个)
int Delete_name(NODE* h, char *data);

//查找,按名字输出
void Risplay_name(NODE* h, char *data);

// 删除元素:根据ID删除指定数据(只能删除第一个)
int Delete_id(NODE* h,int id);

//查找name的数据个数,并且返回
int Find_name1(NODE* h,char *data);

再是主程序

/*
2017年7月25日08:51:15
项目:制作一个同学通讯录
*/

#include<stdio.h>
#include"LinkList.h"
#include<stdlib.h>
#include<string.h>

int main()
{
	system("clear");              //清屏
	
	NODE * h = Create_List();   //创建一个通讯录(头结点)
	if (h == NULL )
		return FALSE;
	
  	menu(h);                     //调用菜单
 	
	return 0;
}


// 创建一个头结点线性链表
NODE * Create_List()
{
	NODE *head = (NODE *)malloc(sizeof(NODE)/sizeof(char));
	if (head == NULL)
	{
		printf("创建失败。\n");
		return NULL;
	}
	head->next = NULL;
	return head;
} 


//菜单
void menu(NODE* h)      
{  	
    system("clear");
    //定义主菜单
	char *menu[] = {
		"                          ------------------------------------------------\n",
		"                          |                                              |\n",
		"                          |                    通讯录                    |\n",
		"                          |                                              |\n",
		"                          |                                              |\n",
		"                          |       A:添加好友           B:列表好友       |\n",
		"                          |                                              |\n",
		"                          |                                              |\n",
		"                          |       c:搜索好友           D:删除好友       |\n",
		"                          |                                              |\n",
		"                          |                 (q退出软件)                  |\n",
		"                          ------------------------------------------------\n"};
		
	int i;
	for (i=0;i<12;i++)
		printf("%s",menu[i]);

	char ch;
	while(1)
	{
		scanf("%c",&ch);
		while(getchar() != '\n');
		if (ch!='a' && ch!='b' && ch!='c' && ch!='d' && ch!='q')
		{
			printf("input again!\n");
			continue;
		}
		switch (ch)
		{
			case 'a':
				add_address_list(h);
				break ;
			case 'b':
				Risplay_Id(h);
				break ;
			case 'c':
				Find_friend(h);
				break ;
			case 'd':
				Del_name_id(h);
				break ;
			case 'q':
				break ;	
		}
		break;		
	}

}

//命令一:添加通讯录
void add_address_list(NODE* h)
{
	if (h == NULL)
		return ;
	
	system("clear"); 
	
	LinkData data;
	printf("请输入好友ID:");
	scanf("%d",&data.id);	
	printf("请输入好友姓名(英文):");
	scanf("%s",data.name);
	printf("请输入好友电话号码:");
	scanf("%s",data.phone_num);
	printf("请输入好友家庭住址:");
	scanf("%s",data.house);
	printf("请输入好友公共电话:");
	scanf("%s",data.telephone);
	
	if (Insert_Last(h,data)==TRUE)
		printf("添加成功!\n");
	else printf("添加失败!\n");
	
	
	getchar();
	printf("按任意键返回返回\n");
	char ch;
	scanf("%c",&ch);
	menu(h); 
}
// 插入元素:尾插
int Insert_Last(NODE* h,LinkData data)
{
	if ( h == NULL )
		return FALSE;
	
	NODE *node = (NODE *)malloc(sizeof(NODE)/sizeof(char));
	if (node == NULL)
		return FALSE;
	
	node->data = data;
	
	node->next = NULL;
	NODE *tmp = h;
	while(tmp->next)
	{
		tmp = tmp->next;
	}
	tmp->next = node;
	
	return TRUE;    
}


//命令二:排序显示(按照ID排序)
void Risplay_Id(NODE* h)
{
	if (h == NULL || h->next == NULL)    
		return ;
	
	NODE *tmp;
	int len = Get_Len(h);
	int i,j;
	for(i=0;i<len-1;i++)
	{	
		tmp = h->next;
		for(j=0;j<len-i-1;j++)
		{
			if(tmp->data.id > tmp->next->data.id)
			{
				LinkData tmp1;
				tmp1            = tmp->next->data;
				tmp->next->data = tmp->data;
				tmp->data       = tmp1;
			}
			tmp = tmp->next;	
		}
	}
	Risplay(h);
	
	getchar();
	printf("按任意键返回返回\n");
	char ch;
	scanf("%c",&ch);
	menu(h); 

}
//显示通讯录
void Risplay(NODE* h)
{
	if (h == NULL)
		return ;
	
	system("clear"); 

	while(h->next != NULL)
	{
		printf("好友ID:%d\n",h->next->data.id);
		printf("好友姓名(英文):%s\n",h->next->data.name);
		printf("好友电话号码:%s\n",h->next->data.phone_num);
		printf("好友家庭住址:%s\n",h->next->data.house);
		printf("好友公共电话:%s\n\n",h->next->data.telephone);
		h = h->next; 
	}
	printf("\n");	
}
// 求链表长度:通过函数返回值返回
int Get_Len(NODE* h)
{
	if(h == NULL )
		return FALSE;
	
	int count = 0;
	NODE* tmp = h;
	while(tmp->next)
	{
		count ++;
		tmp = tmp->next;
	}
	return count;
}


//命令三:搜索好友
void Find_friend(NODE* h)
{
	if (h == NULL )    
		return ;
	
	system("clear");
	if(h->next == NULL)
	{
		printf("没有好友,查找失败。\n");
		return ;
	}
	
	char data[15];
	printf("请输入你要查找的成员名字:");
	scanf("%s",data);
	
	int x = 1;     //x表示搜索的次数
	NODE* tmp = h->next;
	Find_name(tmp,data,x);
	
	getchar();
	printf("按任意键返回返回\n");
	char ch;
	scanf("%c",&ch);
	menu(h); 
}
//搜索好友:按名字搜索(只能搜索第一个)
void  Find_name(NODE* tmp,char *data,int x)  
{
	while(tmp)
	{
		if(strcmp(tmp->data.name,data) == 0 )
			break;
		tmp = tmp->next;
	}
	if (tmp == NULL && x == 1)        //第一次查找,没有找到
	{
		printf("查找失败,没有该好友。\n");
		return ;
	}
	if (tmp == NULL && x != 1)        //非第一次查找        
		return ;
	
	printf("好友ID:%d\n",tmp->data.id);
	printf("好友姓名(英文):%s\n",tmp->data.name);
	printf("好友电话号码:%s\n",tmp->data.phone_num);
	printf("好友家庭住址:%s\n",tmp->data.house);
	printf("好友公共电话:%s\n\n",tmp->data.telephone);
	
	if (tmp != NULL )
		Find_name(tmp->next,data,x+1);

}

//命令4:删除好友
void  Del_name_id(NODE* h)
{
	if (h == NULL)
		return ;
	
	system("clear");
	Risplay(h);                //先查看元素
	char data[15];
	printf("请输入你要删除的成员名字:");
	scanf("%s",data);
	int x = Find_name1(h,data);   //x表示找到的个数
	if( x == 1)              //找到一个
	{
		if(Delete_name(h,data) == TRUE)   	//删除
		printf("删除成功!\n");
		else
		{
			printf("删除失败,没有该好友。\n");
		}
	}
	else if( x>1)                 //找到两个以上
	{
		Risplay_name(h,data);
		printf ("请在输入你要删除的成员ID:");
		int id;
		scanf("%d",&id);
		if(Delete_id(h,id) == TRUE)
		{
			printf("删除成功\n");
		}
		else
		{
			printf("删除失败,没有该好友。\n");
		}
	}

	getchar();
	printf("按任意键返回返回\n");
	char ch;
	scanf("%c",&ch);
	menu(h); 
}

//查找name的数据个数,并且返回
int Find_name1(NODE* h,char *data)
{
	if (h == NULL )    
		return ;
	if(h->next == NULL)
	{	
		printf("表为空,删除失败。\n");
		return FALSE;
	}
	
	int count = 0;
	NODE* tmp = h->next;
	while(tmp)
	{
		if(strcmp(tmp->data.name,data) == 0 )
			count ++;
		tmp = tmp->next;
	}
	if (count == 0)       
	{
		printf("删除失败,没有该好友。\n");
		return FALSE;
	}
	
	return count ;
}

// 删除元素:根据名字删除指定数据(只能删除第一个)
int Delete_name(NODE* h, char *data)
{
	if (h == NULL)
		return FALSE;
	
	NODE* tmp = h;
	while(tmp->next)
	{
		if(strcmp(tmp->next->data.name,data) == 0)
			break;
		tmp = tmp->next;
	}
	if(tmp->next == NULL)
		return FALSE;
	NODE *p = tmp->next;
	tmp->next = p->next;
	free(p);
	
	return TRUE;
}
//查找,按名字输出
void Risplay_name(NODE* h, char *data)
{
	if (h == NULL )    
		return ;
	system("clear");
	
	NODE* tmp = h->next;
	while(tmp)
	{
		if(strcmp(tmp->data.name,data) == 0 )
		{
			printf("好友ID:%d\n",tmp->data.id);
			printf("好友姓名(英文):%s\n",tmp->data.name);
			printf("好友电话号码:%s\n",tmp->data.phone_num);
			printf("好友家庭住址:%s\n",tmp->data.house);
			printf("好友公共电话:%s\n\n",tmp->data.telephone);
		}
		tmp = tmp->next;
	}
	
}

// 删除元素:根据ID删除指定数据(只能删除第一个)
int Delete_id(NODE* h,int id)
{
	if (h == NULL)
		return FALSE;
	
	NODE* tmp = h;
	while(tmp->next)
	{
		if(id == tmp->next->data.id)
			break;
		tmp = tmp->next;
	}
	if(tmp->next == NULL)
		return FALSE;
	NODE *p = tmp->next;
	tmp->next = p->next;
	free(p);
	return TRUE;
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值