通讯录(链表实现,基本功能都有)

1、头文件

#ifndef _LIST_H_
#define _LIST_H_
#include <stdio.h>
#define FAILURE 1000
#define SUCCESS 1001
#define FALSE   1002
#define TRUE    1003
struct node
{
    char ID[10];
    char name[10];
	char tel[10];
	struct node * next;
};
typedef struct node Node;
int link_init(Node **head);//初始化
int link_insert(Node **head,void (*p)(Node *));//尾插法
int link_delete(Node **head,char *ID);//删除
int link_display(Node *head,void (*p)(Node *));//遍历
int link_search(Node *head,char *ID,void (*p)(Node *));//搜索
int link_modify(Node *head,char *ID,void (*p)(Node *));//修改
void put_in(Node*);
void print(Node *);
#endif

2、链表功能函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"//要注意头文件的格式,并且要用""包含文件

void put_in(Node *newnode)//插入
{
	printf("请输入ID:\n");
	scanf("%s",newnode->ID);
	printf("请输入name:\n");
	scanf("%s",newnode->name);
	printf("请输入tel:\n");
	scanf("%s",newnode->tel);
}

void print(Node * temp)
{
    printf("\n-------------------------------\n");
    printf("ID  :%s    ",temp->ID);
	printf("name:%s    ",temp->name);
	printf("tel :%s    ",temp->tel);
	printf("\n");
}

int link_init(Node **head)//初始化
{

    *head = (Node *)malloc(sizeof(Node));
	if(*head == NULL)
	{
	    return FAILURE;
	}
    else
	{
	    (*head)->next = NULL;
		return SUCCESS;
	}
}

int link_delete(Node **head,char *ID)//按ID删除
{   
    if((*head)==NULL)
	{
	    return FAILURE;
	}

    if((*head)->next == NULL)
	{
		return FAILURE;
	}

	    Node* temp = *head;
		Node*p;
	    while(temp->next!=NULL)
		{
		    if(strcmp(temp->next->ID,ID) == 0)
			{
			    p = temp->next;//标记
			    temp->next = temp->next->next;
				free(p);
				return SUCCESS;
			}
			temp = temp->next;
		}
		return FAILURE;
}

int link_display(Node *head,void (*p)(Node *))//遍历
{
    if(head->next == NULL)
	{
        printf("链表是空的,查看失败!\n");
		return FAILURE;
	}
	else
	{
        Node *temp = head;
		temp = temp->next;//temp指向第一个结点
		while(temp != NULL)
		{
		    p(temp);
			temp = temp->next;
		}
		return SUCCESS;
	}
}

int link_insert(Node **head,void p(Node *))//尾插法
{//通过调用函数输入数据
    
	if((*head) == NULL)
	{
	    return FAILURE;
	}

    Node *newnode=(Node *)malloc(sizeof(Node));
    if(newnode == NULL)
	{
        return FAILURE;
    }

	Node* temp = *head;
	while(temp->next != NULL)
    {
        temp = temp->next;
    }

	temp->next = newnode;
	newnode->next = NULL;
	p(newnode);
	return SUCCESS;
}


int link_search(Node *head,char *ID,void p(Node *))
{//通过函数打印数据
    if(head->next == NULL)
	{
	    //printf("链表为空,无法查找!\n");
		return FAILURE;
	}
    else
	{
	    Node * temp = head->next;
		while(temp!= NULL)
		{
		    if(strcmp(temp->ID,ID) == 0)
			{
			    p(temp);//打印
				return SUCCESS;
			}
			temp = temp->next;
		}
		if(temp == NULL)
		{
		    return FAILURE;
		}
	}
}


int link_modify(Node *head,char *ID,void (*p)(Node*))//调用print函数
{
	 if(head==NULL||head->next==NULL)
	 {
	     return FAILURE;
	 }
	 else
	 {
	     Node *temp = head->next;//指向第一个结点
	     while(temp!=NULL)
		 {
		     if(strcmp(temp->ID,ID)==0)
			 {
			   // printf("请输入修改后的信息:\n");
				p(temp);
				return SUCCESS;
			 }
			 temp = temp->next;
		 }
		 return FAILURE;
	 }
}

3、main函数及其他子函数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"
enum HUANSHU  //枚举类型,避免case语句中出现幻数,从第一个值依次累加
{
	QUIT=0,
	ADD,
    DISPLAY,//逗号
	SEARCH,
    DELETE,
	MODIFY,
};


void menu()//菜单
{
    printf("                         --------------------------------------------\n");
    printf("                         -------------------\033[0;34m通讯录\033[0m-------------------\n");
	printf("\n                        ************\033[1;34m1、添加联系人信息\033[0m****************\n\n"); 
	printf("\n\n                        ************\033[1;34m2、查看所有联系人\033[0m****************\n\n");
	printf("\n\n                        ************\033[1;34m3、搜索联系人信息\033[0m****************\n\n");
	printf("\n\n                        ************\033[1;34m4、删除联系人信息\033[0m****************\n\n");
	printf("\n\n                        ************\033[1;34m5、修改联系人信息\033[0m****************\n\n");
    printf("\n\n                        ------------\033[1;34m0、退出\033[0m--------------------------\n");
    printf("                        ---------------------------------------------\n");
}


void deal_A(int ret)
{
   if(ret == SUCCESS)
   {
       printf("\033[0;34m[Insert Success]\033[0m\n");
	   printf("\033[0;34m提示:[q键+回车 退出][回车 继续输入]\033[0m\n");
	   getchar();//接回车键
   }
   else if(ret == FAILURE)
   {
	   printf("\033[0;31m[Insert Failure]\033[0m\n");
	   printf("\033[0;31m[请重新输入!]\033[0m\n");
   }
}

void deal_M(int ret)//修改
{ 
   if(ret == SUCCESS)
   {
       printf("\033[0;34m[修改成功!]\033[0m\n");
   }
   else if(ret == FAILURE)
   {
	   printf("\033[0;31m[修改失败!]\033[0m\n");
	   printf("\033[0;31m[找不到该联系人!]\033[0m\n");
   }
   printf("\033[0;34m[请按任意键继续...]\033[0m\n");
}

void deal_S(int ret)//修改
{ 
   if(ret == SUCCESS)
   {
       printf("\033[0;34m[搜索成功!]\033[0m\n");
   }
   else if(ret == FAILURE)
   {
	   printf("\033[0;31m[搜索失败!]\033[0m\n");
	   printf("\033[0;31m[找不到该联系人!]\033[0m\n");
   }
   printf("\033[0;34m[请按任意键继续...]\033[0m\n");
}

void deal_D(int ret)//查看
{ 
   if(ret == SUCCESS)
   {
       printf("\033[0;34m[查看成功!]\033[0m\n");
   }
   else if(ret == FAILURE)
   {
	   printf("\033[0;31m[查看失败!]\033[0m\n");
	   printf("\033[0;31m[链表可能为空!]\033[0m\n");
   }
   printf("\033[0;34m[请按任意键继续...]\033[0m\n");
}


void deal_Del(int ret)//删除
{ 
   if(ret == SUCCESS)
   {
       printf("\033[0;34m[删除成功!]\033[0m\n");
   }
   else if(ret == FAILURE)
   {
	   printf("\033[0;31m[删除失败!]\033[0m\n");
	   printf("\033[0;31m[找不到该联系人!]\033[0m\n");
   }
   printf("\033[0;34m[请按任意键继续...]\033[0m\n");
 }

int main()
{
    Node *head;
    int choice;
	int ret;
	char ch;
	link_init(&head);
	while(1)
	{
	    ret = 0;
	    menu();
	    printf("\n请输入0到5进行选择:\n");
		scanf("%d",&choice);
        printf("choice  = %d\n",choice);		
		switch(choice)
		{
		    case ADD:
			{
			    system("clear");
				while(1)//循环插入
				{
					deal_A(link_insert(&head,put_in));
	                if((ch = getchar()) == 'q')//用if语句判断,跳出外层while循环,退回主函数
	                {
	                    break;
	                }
    				ret = 0;//归位
				}
			    break;
			}
		    case DISPLAY: 
			{
			    system("clear");
                deal_D(link_display(head,print));
				getchar();
				getchar();
			    break;
			}
		    case SEARCH: 
			{   
			    char ID[20];
			    system("clear");
				
	            printf("\033[0;31m请输入你要搜索的联系人ID:\033[0m\n");
				scanf("%s",ID);
				deal_S(link_search(head,ID,print));//需要另外的参数
				getchar();
				getchar();
			    break;
			}
		   case DELETE:
			{
			    char ID[20];
                                            
			    system("clear");

	            printf("\033[0;31m请输入你要删除的联系人ID:\033[0m\n");
				scanf("%s",ID);
			    deal_Del(link_delete(&head,ID));//需要另外一个参数
				getchar();
				getchar();
			    break;
		    }
			case MODIFY:
			{
			    char ID[20];
			    system("clear");
	            printf("\033[0;31m请输入你要修改信息的联系人的ID:\033[0m\n");
				scanf("%s",ID);
                deal_M(link_modify(head,ID,put_in));
				getchar();
				getchar();
			    break;
			}
			case QUIT:
			{
			    exit(1);
			    break;
			}
		}
	}
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值