通讯录

/*******************************************************************
需求:制作一个电子通讯录,通过该通讯录能录入好友ID号、姓名(英文)、手
机号码,家庭住址,公司电话。
模块:
主界面:主要显示软件功能,A)添加好友信息 B)列表好友信息。(包含排序
功能) C)搜索好友 D)删除好友
A)用户输入INSERT命令后,让用户输入好友信息。添加成功或失败都需提示
B)用户输入DISPLAY命令后,好友信息升序排列
C)用户输入SEARCH命令后,让用户输入将要搜索好友姓名查询。如果未搜索
到请友好提示。如果搜索到,显示处该好友信息
D)用户输入DELETE命令后,让用户输入将要删除好友姓名删除,如果存在同
名的多个好友,则列表出,所有同名的好友信息,让用户通过输入ID号删除

提示用户删除成功。



head.h

#ifndef HEAD_H_
#define HEAD_H_

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>             // sleep函数头文件

#define uint unsigned int
#define OK            0
#define ERROR         -1
#define MALLOC_ERROR  -2
#define N             20 

typedef int ElementType;
typedef struct _data
{
    ElementType ID;             // ID号
    char Name [N];              // 姓名
    char Mobile_Phone [N];      // 手机号码
    char Home_Address [N];      // 家庭住址
    char Company_Tell [N];      // 公司电话
}Data;

typedef struct _node
{
	Data data;
	struct _node *next;
}Node;

typedef Node* PNode;            //重命名节点指针类型

//显示操作界面
int Interface_Display ();

//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num);

//显示所有好友信息
int Friend_Information (PNode head);

//查找好友
int Search_Friend (PNode head, char* Name);

//删除好友
void Delete_Friend (PNode head, char* Name);

void Delete_Pos(PNode head);

#endif


head.c


#include "head.h"
#include <stdio.h>

//显示操作界面
int Interface_Display ()
{
    system ("clear");
    printf ("\t~***************************************~\n");
    printf ("\t~          欢迎使用通讯录               ~\n");
    printf ("\t~                                       ~\n");
    printf ("\t~      1 >>>>>>>> 添加好友信息          ~\n");
    printf ("\t~      2 >>>>>>>> 列表好友信息          ~\n");
    printf ("\t~      3 >>>>>>>> 搜索好友              ~\n");
    printf ("\t~      4 >>>>>>>> 删除好友              ~\n");
    printf ("\t~      5 >>>>>>>> 退出                  ~\n");
    printf ("\t~                                       ~\n");
    printf ("\t~                                       ~\n");
    printf ("\t~                                       ~\n");
    printf ("\t~***************************************~\n");
    printf ("                                           \n");
    printf ("                                           \n");
    printf ("\t请输入对应数字选择相应功能:");
}

//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num)
{

    if (NULL == head)
    {
        return ERROR;
    }

    //创建一个新的结点
    PNode p = (PNode) malloc(sizeof(Node)/sizeof(char));
    if (NULL == p)
    {
        return MALLOC_ERROR;
    }

    //将新数据赋给新结点
    system("clear");    
    printf ("\t*************添加好友***************\n");

    p->data.ID = num;
    printf ("\t好友的ID为:%d\n", p->data.ID);
    printf ("\n");

    printf ("\t请输入好友的名字:");
    scanf  ("%s", p->data.Name);
    printf ("\n");

    printf ("\t请输入好友的手机号:");
    scanf  ("%s", p->data.Mobile_Phone);
    printf ("\n");

    printf ("\t请输入好友的家庭住址:");
    scanf  ("%s", p->data.Home_Address);
    printf ("\n");

    printf ("\t请输入好友的公司电话:");
    scanf  ("%s", p->data.Company_Tell);
    printf ("\n");

    p->next = NULL;

    //找到最后一个结点
    PNode Ptmp;                 //将头结点地址给临时指针Ptmp
    Ptmp = head;
    while (Ptmp->next)
    {
        Ptmp = Ptmp->next;
    }
    Ptmp->next = p;

    return OK;
}

//显示所有好友信息
int Friend_Information (PNode head)
{
    if (NULL == head)
    {
        return ERROR;
    }

    PNode p = head->next;

    printf ("\tID\t姓名\t\t手机号\t\t住址\t\t\t公司电话\n");

    while (p)
    {
        printf ("\t%d\t%s\t\t%s\t\t%s\t\t\t%s\n", p->data.ID,
              p->data.Name, p->data.Mobile_Phone, p->data.Home_Address, 
              p->data.Company_Tell);
        p = p->next;
    }
    putchar('\n');

    return OK;
}

//查找好友
int Search_Friend (PNode head, char* Name)      //通过名字查找好友
{
    PNode p = head;
    PNode q = NULL;

    if ((NULL != p) && NULL != (p->next))
    {
        while (p->next) 
        {
            q = p->next;
            if ((NULL != q) && 0 == (strcmp(q->data.Name, Name)))
            {
                printf ("\t好友信息: \n\tID:%d\n\t姓名: %s\n\t手机号码: %s\n\t家庭地址:%s\n\t公司电话: %s\n",
				q->data.ID, q->data.Name, q->data.Mobile_Phone, q->data.Home_Address, q->data.Company_Tell);
				printf("\n");
				printf("\n");
            }
            else
            {
                printf ("\t对不起,您的通讯录没有该好友!\n");
            }
            p = p->next;
        }
    }
	
	

    /*  另一种做法
    if (NULL == head)
    {
        return ERROR;
    }

    PNode p;
    int flag = 1;
    for (p = head->next; p != NULL; p = p->next)
    {
        if (0 == strcmp(p->Name, Name))
        {
            flag = 0;
            printf ("\t好友信息:\n\tID: %d\n\t姓名: %s\n\t手机号码: %s\n\t家庭地址: %s\n\t公司电话: %s\n", p->ID, p->Name, p->Mobile_Phone, p->Home_Address, p->Company_Tell);
        }
    }
    fi (flag)
    {
        printf ("\t对不起,您的通讯录没有该好友!\n");
    }

    putchar('\n');
    */

    return OK;
}


void Delete_Pos(PNode head)
{
	if (head == NULL)
		return ;
	


	PNode tmp = head;
	int id;
	printf("请输入想删除好友的ID:");
	scanf("%d",&id);
	while(tmp->next)
	{
		if (tmp->next->data.ID == id)
		{
			break;
		}
		tmp = tmp ->next;
	}
	PNode p = tmp->next;
	tmp->next = tmp ->next->next;
	free(p);
	
	int j;
	printf ("\t正在删除\n");
	printf ("\t请稍候");
	fflush (stdout);            //强制刷新缓存,输出显示
	for (j = 0; j < 3; j++)
	{
		sleep (1);              //linux使用sleep,参数为秒
		printf (".");
		fflush(stdout);         //强制刷新缓存,输出显示
	}
	printf ("\n");
	printf ("\t该好友已成功删除!\n");
}

//删除好友
void Delete_Friend (PNode head, char* Name)
{
    PNode p = head->next;
    
	
	int count = 0;
	while (p)
	{
		if(strcmp(p->data.Name,Name) == 0)
		{
			count++;
		}
		p = p->next;
	}
	if(count == 0)
		printf("通讯录里没有该好友\n");
	else if(count == 1)
	{
		PNode a = head;
		PNode q = NULL;

		while (NULL != a && NULL != (a->next))
		{
			q = a->next;
			if (NULL != q && 0 == strcmp(q->data.Name, Name))
			{
				a->next = q->next;
				free(q);

				int j;

				printf ("\t正在删除\n");
				printf ("\t请稍候");
				fflush (stdout);            //强制刷新缓存,输出显示
				for (j = 0; j < 3; j++)
				{
					sleep (1);              //linux使用sleep,参数为秒
					printf (".");
					fflush(stdout);         //强制刷新缓存,输出显示
				}
				printf ("\n");
				printf ("\t该好友已成功删除!\n");
			}
		}
	}
	else if(count >1)
	{
		
		int id;
		Search_Friend(head,Name);
		Delete_Pos(head);
		
	}
}


main.c


#include "head.h"

int main ()
{
	int Function;
	int i = 0;
	char Name[N];
	int cho;
	
	// 创建头结点并为其分配空间
	PNode head_node = (PNode) malloc(sizeof(Node)/sizeof(char));
	if (NULL == head_node)
	{
		return MALLOC_ERROR;
	}
	head_node->next = NULL;

	
/***********************************************************************
	打开存放信息的文件并将里面的数据导入到链表中区
***********************************************************************/
	// 以只读方式打开存放信息的文件,
    FILE *fp1 = fopen ("student.txt", "r+");  
    if (NULL == fp1)  
    {  
        printf ("fopen");  
        return -1;  
    }  
	
	PNode tmp = head_node; 
	int count;  
    int ret;  
	
	// 保存读记录的个数并判断是否读到文件结尾,如果读到文件结尾,
	// 它返回一个非0 的值
    ret = fread (&count, sizeof(int), 1, fp1);  
    if(ret != 0)  
    {  
        for (i = 0; i < count; i++)  
        {
			// 创建新结点用来保存读取的数据
            Node *node = (Node*)malloc(sizeof(Node)/sizeof(char)); 		

			int len;  					
            fread (&len, sizeof(int), 1, fp1); 	    // 读取数据长度
            fread (&(node->data), len, 1, fp1); 	// 读取数据  
            
            node->next = NULL;		
            while (tmp->next)  						// 向后遍历
            {  
                tmp = tmp->next;  
            }  
            tmp->next = node; 						// 将结点导入链表中 
        }  
    } 
	
    if (ret == 0 && !feof(fp1))  						// 读取失败
    {  
        perror ("fread");  
        return -1;  
    }  
    fclose (fp1); 						// 关闭刚刚打开的文件
/***********************************************************************
	文件导入链表结束,关闭文件
***********************************************************************/	
	
	i = 1;								// i初始化(i既是ID编号)
	while (1)
	{
		Interface_Display ();			// 主界面
		scanf ("%d", &Function);
		
		switch (Function)				// 功能选择
		{
			case 1: 					// 添加好友
			{
				Function = 0;
				Add_Friend (head_node, i++);
				int j;
				
				printf ("\t正在添加\n");
				printf ("\t请稍候");
				fflush (stdout);		// 强制刷新缓存,输出显示
				for (j = 0; j < 2; j++)
				{
					sleep (1);			// Linux 使用sleep,参数为秒
					printf (".");
					fflush (stdout);	// 强制刷新缓存,输出显示
				}
				printf ("\n");
				printf ("\t添加成功!\n");
				printf ("\t返回主菜单请输入1:");
				scanf ("%d", &cho);
				if (1 == cho)
				{
					break;
				}
				else
				{
					printf ("\t对不起!您的输入有误!请重新输入:");
					scanf ("%d", &cho);
					break;
				}
				break;
			}			
			case 2:					// 显示好友信息
			{
				system ("clear");
				printf ("\t***********好友信息******************\n");
				printf ("\n");
				
				Friend_Information (head_node);
				Function = 0;
				printf ("\t返回主菜单请输入1:");
				scanf ("%d", &cho);
				if (1 == cho)
				{
					break;
				}
				else
				{
					printf ("\t对不起!您的输入有误!请重新输入:");
					scanf ("%d", &cho);
					break;
				}
				break;
			}
			case 3:					// 查找好友
			{
				system ("clear");
				printf ("\t*************查找好友*************\n");
				printf ("\t请输入您要查找的好友姓名:");
				scanf  ("%s", Name);
				printf ("\n");
				
				int j;			
				printf ("\t正在查找\n");
				printf ("\t请稍候");
				fflush (stdout);		// 强制刷新缓存,输出显示
				for (j = 0; j < 2; j++)
				{
					sleep (1);			// Linux 使用sleep,参数为秒
					printf (".");
					fflush (stdout);	// 强制刷新缓存,输出显示
				}
				printf ("\n");
				Search_Friend (head_node, Name);
				printf ("\t返回主菜单请输入1:");
				scanf ("%d", &cho);
				if (1 == cho)
				{
					break;
				}
				else
				{
					printf ("\t对不起!您的输入有误!请重新输入:");
					scanf ("%d", &cho);
					break;
				}
				break;
			}
			case 4:						//删除好友
			{
				system ("clear");
				printf ("\t*************删除好友*************\n");
				printf ("\t请输入要删除好友的姓名:");
				scanf  ("%s", Name);
				printf ("\n");
				Delete_Friend (head_node, Name);
				printf ("\t返回主菜单请输入1:");
				scanf ("%d", &cho);
				if (1 == cho)
				{
					break;
				}
				else
				{
					printf ("\t对不起!您的输入有误!请重新输入:");
					scanf ("%d", &cho);
					break;
				}
				break;
			}	
			case 5:						//退出通讯录
			{
				
/************************************************************************
				退出程序前,将链表中的数据导入到文件中去
************************************************************************/
				// 以更新方式打开存放信息的文件(打开时会清空文件)
				FILE *fp2 = fopen ("student.txt", "wb+");  
				if(NULL == fp2)  
				{  
					printf ("fopen");  
					return -1;  
				}  
							
				tmp = head_node->next;  		// tmp为第一个结点
				count = 0;  					// 用来存放链表长度
				while(tmp)  					// 求链表长度
				{  
					count++;  
					tmp = tmp->next;  
				}
				
				// 要写入个数
				fwrite(&count, sizeof(Data), 1, fp2);  
				tmp = head_node;  				// 初始化
				while (tmp->next)  
				{  
					Node* p = tmp->next;  
					tmp->next = p->next;  
					
					// 写入数据的长度 					
					int len = sizeof(p->data);  
					fwrite (&len, sizeof(int), 1, fp2);  
					
					//写入数据  
					fwrite (&(p->data), sizeof(Data), 1, fp2);  
					
					free (p); 					 
				}  
				fclose (fp2);  
/************************************************************************
				数据保存结束,即将退出程序
************************************************************************/
				
				Function = 0;
				system ("clear");
				exit (0);
			}
			default:  					//输入有误
			{
				Function = 0;
				printf ("\t对不起!您的输入有误!请重新输入:");
				scanf ("%d", &Function);
				break;
			}			
		}		
	}	
	
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值