链表实现通讯录

这篇博客适合初学者,详细介绍了如何运用指针函数和二级指针操作来实现链表结构的通讯录,特别强调了删除功能的条件判断以及编程过程中保持冷静的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初学者 第一次写通讯录,写到头皮发麻。

灵活运用指针函数,返回值为指针

注意使用二级指针操作头指针head

注意del函数的判断条件
切记不骄不躁!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#define LEN sizeof(struct information)
//定义结构体
typedef struct information
{
    char name[20];
    char id[20];
    char phone[20];
    char home[20];
    struct information *next;
}INFO;

//主菜单函数
void face()
{
    printf("******address list*****\n");
    printf("1:show  all information\n");
    printf("2:add       information\n");
    printf("3:delete    information\n");
    printf("4:modify    information\n");
    printf("5:search    information\n");
    printf("0:quit\n");
    printf("***********************\n");
}
//显示所有联系人
INFO *print(INFO *head)
{
    INFO *p;
    p = head;
    //system("clear");

    if(head != NULL)
    {
    	 printf("***********************\n");
        printf("members are as follow!\n");
        while(p != NULL)
        {
            printf("name:%s\t",p->name);
            printf("id:%s\t",p->id);
            printf("phone:%s\t",p->phone);
            printf("home:%s\n",p->home);
            p = p->next;
        }
    }

    else
    {
    	 printf("***********************\n");
        printf("address_list is none!\n");
    }
    return head;
}
//增加联系人函数
INFO *add(INFO *head)
{
	INFO *new_node = (INFO*)malloc(LEN);
	
    printf("***********************\n");
    printf("please input name!\n");
    scanf("%s",new_node->name);
    printf("please input id!\n");
    scanf("%s",new_node->id);
    printf("please input phone!\n");
    scanf("%s",new_node->phone);
    printf("please input home!\n");
    scanf("%s",new_node->home);
    printf("successfully added!\n");

    INFO * p;
    p = head;
    if(head == NULL)               //当通讯录为空时
    {
        head = new_node;
        new_node->next = NULL;
    }
    else                       //不为空
    {
        while(p->next !=NULL)
        {
            p = p->next;
        }
        p->next = new_node;
        new_node->next = NULL;
    }
    return (head);
}
//删除联系人函数
INFO *del(INFO ** head)
{   
    char key[20];
    printf("please input name!\n");
    scanf("%s",key);

    INFO * p;
    INFO * q;
    p = *head;
    q = *head;  
    if(*head == NULL)            //当通讯录为空时
    {
    	 printf("***********************\n");
        printf("it is empty!\n");
    }
    else
    {
        if(0 == strcmp((*head)->name,key))         //当要是删除第一个联系人时
        {
            *head = (*head)->next;
            printf("delete sucessfully!\n");
            
        }
        else
        {
            while(p->next != NULL && 0 != strcmp(p->name,key))
            {
            	q = p;
            	p = p->next;
            }
            if(p->next ==NULL && 0 == strcmp(p->name,key))  //最后一个为要删除的人时
            {
            	q->next = NULL;
            	free(p);
            	printf("del sucessfully!\n");
            }
            if(p->next !=NULL&& 0 == strcmp(p->name,key)) //不是最后一个
            {
            	q->next = p->next;
            	free(p);
            	printf("del sucessfully!\n");
            }
            if(p->next !=NULL&& 0 != strcmp(p->name,key)) //找不到这样的人
            {
            	printf("no such person!\n");
            }
        }
        return *head;
    }   
}
	
//第二种方法
   /* INFO *p1;
    INFO *p2;
    p1 = head;
    p2 = head;
    if(head != NULL)
    {
        while(p1 !=NULL)
        {
            if(0 == strcmp(p1->name,key))
            {
                if(head != p1)
                {
                    p2->next = p1->next;
                }
                else
                {
                    head = p1->next;
                }
                free(p1);
                printf("delete sucessfully!\n");
                return head;
            }
            else
            {
                p2 = p1;
                p2->next = p1;
            }
        }
        printf("no such person!");
    }
    else
    {
        printf("it is empty!\n");
        return head;
    }
}*/
//修改联系人信息
INFO *modify(INFO *head)
{
	INFO *p, *q;
	char key[20];
	p = head;
    q = head;
	
	printf("please input name!\n");
	printf("****************************\n");
	scanf("%s",key);
	
	if(head != NULL)
	{
		while(p->next != NULL)
		{
			if(0 == strcmp(p->name,key))                           //非最后一个人是要修改的人时
			{
				printf("the perseon's info as follow:\n"); 
				printf("modify name %s:\n",p->name);
				scanf("%s",p->name);
				printf("modify id%s:\n",p->id);
				scanf("%s",p->id);
			    printf("modify phone%s:\n",p->phone);
			    scanf("%s",p->phone);
				printf("modify home%s:\n",p->home);
				scanf("%s",p->home);
				printf("\n");
				return head;
			}
			else
			{
				q = p;
				p = p->next;
			}
		}
		if(p->next ==NULL&& 0 == strcmp(p->name,key))     //最后一个人是要修改的人时
			{
			printf("the perseon's info as follow:\n");
				printf("modify name %s:\n",p->name);
				scanf("%s",p->name);
				printf("modify id%s:\n",p->id);
				scanf("%s",p->id);
			    printf("modify phone%s:\n",p->phone);
			    scanf("%s",p->phone);
				printf("modify home%s:\n",p->home);
				scanf("%s",p->home);
				printf("\n");
				return head;
			}
			else                                //找不到这样的人
				{
					printf("no such person\n");
				}
	
	}
	else       
	{
		printf("address_list is empty!\n");
	}
	
}
//查找联系人函数
INFO *search(INFO *head)
{
	INFO *p, *q;
	char key[20];
	p = head;
    q = head;
	
	printf("please input name!\n");
	printf("****************************\n");
	scanf("%s",key);
	
	if(head != NULL)            //当通讯录为空时
	{
		while(p->next != NULL)
		{
			if(0 == strcmp(p->name,key))      //非最后一个人是要查找的人时
			{
				printf("the perseon's info as follow:\n");  
				printf("name:%s\t",p->name);
				printf("id:%s\t",p->id);
				printf("phone:%s\t",p->phone);
				printf("home:%s\t",p->home);
				printf("\n");
				return head;
			}
			else
			{
				q = p;
				p = p->next;
			}
		}
		if(p->next ==NULL&& 0 == strcmp(p->name,key))  //最后一个人是要查找的人时
			{
				printf("the perseon's info as follow:\n");
				printf("name:%s\t",p->name);
				printf("id:%s\t",p->id);
				printf("phone:%s\t",p->phone);
				printf("home:%s\t",p->home);
				printf("\n");
				return head;
			}
			else                  //找不到这样的人
				{
					printf("no such person\n");
				}
	
	}
	else
	{
		printf("address_list is empty!\n");
	}
	
}



int main()
{
    int choose;
    INFO *head = NULL;
   
    //system("clear");
    
    while(1)
    {
        face();
        printf("please input your choose!\n");

        scanf("%d",&choose);
        switch(choose)
        {
            case 0:return 0;
            case 1:head = print(head);
                   break;
            case 2:head = add(head);
                   break;
            case 3:head = del(&head);
                   break;
            case 4:head = modify(head);
                   break;
            case 5:head = search(head);
                   break;
         	default:printf("input error!\n");
                   break;

        }

    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值