C语言同学录(通讯录)的实现

这个很久以前就完成了,一直没贴出来。

这个同学录实际上就是通讯录,使用链表实现,也算是对链表的一种运用吧。


具体功能看Menu函数。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Student{
	char name[20];
	char tel[20];
	char qq[20];
	char address[20];
	struct Student *next;
}INFO;

INFO *head;
void  Initiate();//初始化
void Menu ();//主菜单
void Add ();//添加联系人
void List ();//显示通讯录
void Alter();//修改
void Find ();//查找联系人
void Find_Name ();//按姓名查找
void Find_Tel ();//按学号查找
void Delate ();//删除联系人
void Delate_Name ();
void Delate_Tel ();
/* void Delate_Name ();//按姓名删除
void Delate_Tel ();//按电话删除 */

//初始化
void Initiate ()
{
	
	if((head=(INFO*)malloc(sizeof(INFO)))==NULL) exit(1);
    head->next=NULL;
}

//主菜单
void Menu()
{
	printf ("\n");
	printf ("\n");
	printf ("\n");
    printf("**************欢迎使用通讯录系统**************");
    printf("\n");
    printf("\n");
    printf("***********    1.添加好友      ***********\n");
    printf("***********    2.查询好友      ***********\n");
    printf("***********    3.修改好友      ***********\n");
    printf("***********    4.删除好友     ***********\n");
    printf("***********    5.显示所有好友    ***********\n");
    printf("***********    0.退通讯录      ***********\n\n\n");

}
//添加通讯录好友
void Add()
{
	INFO *p,*q;
	if ((q=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1);
    printf("请输入要添加信息!\n");
    printf("姓名:\n");                             //添加信息
    scanf("%s",&q->name);
    printf("电话号码:\n");
    scanf("%s",q->tel);
    printf("QQ:\n");
    scanf("%s",q->qq);
	printf("地址:\n");
    scanf("%s",q->address);
	
	
	
	//保存聊天记录
	FILE *file_in = fopen("同学录.txt", "w");
	if (file_in == NULL)
	{
		perror("fopen TXT");
		return ;
	}

	fprintf (file_in, "姓名:\t%s\t", q->name);
	fprintf (file_in, "号码:\t%s\t", q->tel);
	fprintf (file_in, "QQ:\t%s\t", q->qq);
	fprintf (file_in, "地址:\t%s\t", q->address);
	fclose (file_in);
	
	for (p = head;p->next!=NULL;p=p->next);
	p->next=q;
	q->next=NULL;
	printf("信息已添加完成!\n");
	
}
//查找
void Find ()
{
	int i;
	printf ("\n\n\n\n\n\n**************************************\n");
	printf ("\t\t1按姓名查找\n");
	printf ("\t\t2按电话号码查找\n");
	printf ("**************************************\n");
	printf ("请选择:(按其他数字键返回!)");
	scanf ("%d",&i);
	switch (i)
	{
	case 1:
		{
			Find_Name ();
			break;
		}
	case 2:
		{
			Find_Tel ();
			break;
		}
	
	}
}

void Find_Name ()
{
	INFO *p;
	char name[20];
	if (head->next==NULL) // 如果是一个空链表;
	{
		printf("通讯录空!\n");
        return;
	}
	printf("请输入要查找姓名:\n");
    scanf("%s",&name);
	for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
	{
		if(strcmp(p->name,name)==0)
		{
			printf("姓名\t电话\tQQ\t地址\n");
            printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
		}
		else  if(p->next==NULL)
		{
            printf("没有该好友信息!\n");
		}	
	}
}
	
void Find_Tel ()
{
	INFO *p;
	char tel[20];
	if (head->next==NULL)// 如果是一个空链表;
	{
		printf("通讯录空!\n");
      return;
	}
	printf("请输入要查找电话号码:\n");
    scanf("%s",&tel);
	for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
	{
		if(strcmp(p->tel,tel)==0)
		{
			printf("姓名\t电话\tQQ\t地址\n");
            printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
		}
		else  if(p->next==NULL)
		{
            printf("没有该好友信息!\n");
		}	
	}	
}	
//修改通讯录信息
void Alter()
{
	char name [50]; //先查找 
	INFO *p,*p1;
	if(head->next==NULL)
	{
		printf("通讯录空!\n");
		return;
	}
	printf("请输入要修改姓名:\n");
    scanf("%s",name);
	for(p=head->next;p!=NULL;p=p->next)
	{
		if(strcmp(p->name,name)==0)
        {   
            break;
        }
        else if(p->next==NULL)
        {
            printf("信息!\n");
            return;
        }
	}
	p1=(INFO *)malloc(sizeof(INFO));
    printf("new姓名:\n");                             //添加信息
    scanf("%s",p1->name);
    strcpy(p->name,p1->name);
    printf("new电话号码:\n");
    scanf("%s",p1->tel);
    strcpy(p->tel,p1->tel);
    printf("newQQ:\n");
    scanf("%s",p1->qq);
    strcpy(p->qq,p1->qq);
    printf("new地址:\n");
    scanf("%s",p1->address);
    strcpy(p->address,p1->address);
    printf("信息已修改\n");
    //显示修改信息
    printf("姓名\t电话\tQQ\t地址\n");
    printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
    free(p1);
}
//删除通讯录信息
void Delate()
{
    int i;
	printf ("\n\n\n\n\n\n**************************************\n");
	printf ("\t\t1按姓名删除\n");
	printf ("\t\t2按电话号码删除\n");
	printf ("**************************************\n");
	printf ("请选择:(按其他数字键返回!)");
	scanf ("%d",&i);
	switch (i)
	{
	case 1:
		{
			Delate_Name ();
			break;
		}
	case 2:
		{
			Delate_Tel ();
			break;
		}
	
	}
}
void Delate_Name()
{
	char  name[20];                                     //先查找 删除
    INFO *p = head->next, *p1 =head->next,*p2;
    if (head->next == NULL)
    {
        printf("通讯录空\n");
        return;
    }
    printf("请输入要删除姓名:\n");
    scanf(" %s",name);
    while ((strcmp(p->name,name)!=0 )&& p->next != NULL)
    {
        p1=p;
        p =p->next;
    }
    if (strcmp(name, p->name)==0)                    //输删除信息
    {
        if (p == head->next&&p->next!=NULL)
		{ 
            head->next = p->next;
		}	
        else  if(p==head->next&&p->next==NULL)
        {
            head->next=p->next;
            printf("好友已全部删除!\n");
            return;
        }
        else
            p1->next = p->next;
    }
    else
    {
        printf("不存在该好友!\n");
        return;
    }
    printf("信息已删除!\n");
	printf("您还有以下好友!\n");
    printf("姓名\t电话号码\tQQ\t地址\n");
    for(p2=head->next;p2!=NULL;p2=p2->next)
    printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
}	
	
void Delate_Tel()
{
	char  tel[20];                                     //先查找 删除
    INFO *p = head->next, *p1 =head->next,*p2;
    if (head->next == NULL)
    {
        printf("通讯录空\n");
        return;
    }
    printf("请输入要删除电话号码:\n");
    scanf(" %s",tel);
    while ((strcmp(p->tel,tel)!=0 )&& p->next != NULL)
    {
        p1=p;
        p =p->next;
    }
    if (strcmp(tel, p->tel)==0)                    //输删除信息
    {
        if (p == head->next&&p->next!=NULL)
		{ 
            head->next = p->next;
		}	
        else  if(p==head->next&&p->next==NULL)
        {
            head->next=p->next;
            printf("好友已全部删除!\n");
            return;
        }
        else
            p1->next = p->next;
    }
    else
    {
        printf("不存在该好友!\n");
        return;
    }
    printf("信息已删除!\n");
	printf("您还有以下好友!\n");
    printf("姓名\t电话号码\tQQ\t地址\n");
    for(p2=head->next;p2!=NULL;p2=p2->next)
    printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
	
}	 
//显示所记录	
void List()
{    
    INFO *p;
    if(head->next==NULL)
    {
        printf("通讯录记录!\n");
        return;
    }
   printf("姓名\t电话号码\tQQ\t地址\n");
    for(p=head->next;p!=NULL;p=p->next)
    printf("%s\t%s\t\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
   
}	
	
int main() 
{ 
	

    int  choice;
    char  yes_no;
    
    Initiate();
    do
    {
        Menu();
        printf("请输入指令0-5:\n");
        scanf("%d",&choice);
        printf("\n");
        switch(choice)
       {
            case 1:Add();
			       
            break;
            case 2:Find();
            break;
            case 3:Alter();
            break;
            case 4:Delate();
            break;
            case 5:List();
            break;
            case 0:
            printf("************谢您使用************\n");
            exit(0);  //正常退出
            break;
            default:
            printf("输入误!请重新输入\n");
             break;
        }
         printf("是否继续  Y  or   N?  \n");
         do
        {
           scanf("%c",&yes_no);
        }
	while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
    }
    while(yes_no=='Y'||yes_no=='y');
}

	

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值