基于c语言链表的通讯录

7 篇文章 0 订阅

本人使用makefile文件,所以总代码分为四部分

tele.h:

#ifndef TELE_H
#define TELE_H


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


struct node
{
	char name[12];//姓名
	char sex[10];//性别
	int age;//年龄
	char num[15];//电话
	struct node *next;
};


typedef struct node Node;
typedef struct node * Link;

void display(Link head);
void insert_node(Link head,Link new_node);
void make_empty(Link head);
void delete_node(Link head);
void search(Link head);
void mod_node(Link head);
#endif

tele.c:

#include"tele.h"


void display(Link head)//遍历链表并输出每个结点的内容
{
	Link p;
	p = head->next;
	if(NULL == p)//如果头结点后没有结点,那么没有联系人
	{
		printf("电话簿没有联系人!\n");
		return;
	}
	while(p!= NULL)
	{
		printf("%s   ",p->name );
		printf("%s   ",p->sex );
		printf("%d   ",p->age );
		printf("%s\n",p->num );
		p = p->next;
	}
}


void create_link(Link * head)//新建一个头结点初始化链表
{
	*head=(Link)malloc(sizeof(Node));
	(*head)->next = NULL;
}


void insert_node(Link head,Link new_node)
{
	Link p,q;
	q = head;
	p = q->next;
	new_node=(Link)malloc(sizeof(Node));

	printf("输入姓名:\n");
	scanf("%s",new_node->name);//输入姓名

	while(1==1)//判断性别输入是否正确
	{
		printf("输入性别:(male or female)\n");
		scanf("%s",new_node->sex);//输入性别
		if((strcmp(new_node->sex,"male")!=0)&&(strcmp(new_node->sex,"female")!=0))
		{
			printf("性别输入错误!\n");
		}
		else
			break;
	}
	
	while(1==1)
	{
		printf("输入年龄:\n");
		scanf("%d",&new_node->age);//输入年龄
		if(new_node->age<0||new_node->age>120)
		{
			printf("年龄错误!\n");
		}
		else
			break;
	}
	
	while(1==1)//输入号码并判断号码位数是否正确
	{
		printf("输入号码:\n");
		scanf("%s",new_node->num);
		if(strlen(new_node->num)!=11)
		{
			printf("号码错误!\n");
		}
		else
			break;	
	}

	if(NULL == p)
	{
		q->next = new_node;
		new_node = p;
	}
	else
	{
		while(strcmp((new_node->name),(p->name))==1)
		{
			p = p->next;
			q = q->next;
		}
		new_node->next = p;
		q->next = new_node;
	}
}


void make_empty(Link head)//释放掉除了头结点以外结点的空间
{
	Link p;
	p = head->next;
	while(p!=NULL)
	{
		head->next = p->next;
		free(p);
		p = head->next;
	}
	printf("清空成功\n");
}


void delete_node(Link head)
{
	Link p,q;
	char comp[20];
	p = head->next;
	q = head;
	printf("请输入要删除的联系人姓名:\n");//输入要删除联系人的姓名
	scanf("%s",comp);
	if(p == NULL)
	{
		printf("电话簿没有联系人!\n");
	}
	else
	{
		while(p != NULL && (strcmp(p->name,comp)!=0))//判断姓名是否相同,不同就继续遍历
		{
			q = p;
			p = p->next;
		}
		if(NULL == p)//链表中没有对应姓名的结点
		{
			printf("没有该联系人!\n");
		}
		else
		{
			q->next = p->next;
			free(p);
		}
	}
}


void search(Link head)
{
	char comp[20];
	Link q=head;
	Link p=q->next;
	printf("输入要查找的联系人姓名:\n");//输入要查找的联系人的姓名
	scanf("%s",comp);
	while(p!=NULL&&(strcmp(p->name,comp)!=0))
	{
		q=p;
		p=p->next;
	}
	if(NULL == p)
	{
		printf("查无此人!\n");
		return;
	}
	else//输出联系人所有信息
	{
		printf("%s\t",p->name );
		printf("%s\t",p->sex );
		printf("%d\t",p->age );
		printf("%s\n",p->num );
	}
}


void mod_node(Link head)//修改结点内所有信息
{
	char comp[20];
	Link q=head;
	Link p=q->next;
	printf("输入要修改的联系人姓名:\n");
	scanf("%s",comp);
	while(p!=NULL&&(strcmp(p->name,comp)!=0))
	{
		q=p;
		p=p->next;
	}
	if(NULL == p)
	{
		printf("没有该联系人!\n");
		return;
	}
	else
	{
		printf("输入修改姓名:\n");
		scanf("%s",p->name);//输入姓名

		while(1==1)//判断性别输入是否正确
		{
			printf("输入修改性别:(male or female)\n");
			scanf("%s",p->sex);//输入性别
			if((strcmp(p->sex,"male")!=0)&&(strcmp(p->sex,"female")!=0))
			{
				printf("性别输入错误!\n");
			}
			else
				break;
		}
	
		while(1==1)
		{
			printf("输入修改年龄:\n");
			scanf("%d",&p->age);//输入年龄
			if(p->age<0||p->age>120)
			{
				printf("年龄错误!\n");
			}
			else
				break;
		}
	
		while(1==1)//输入号码并判断号码位数是否正确
		{
			printf("输入修改号码:\n");
			scanf("%s",p->num);
			if(strlen(p->num)!=11)
			{
				printf("号码错误!\n");
			}	
			else
				break;	
		}
	}

}

main.c:

#include"tele.h"


int main()
{
	int i,j,m;
	Link head;
	Link new_node;
	create_link(&head);
	while(1 == 1)
	{
		printf("----------------电话簿---------------\n");
		printf("-----------1.显示所有联系人-----------\n");
		printf("-----------2.新建联系人---------------\n");
		printf("-----------3.搜索联系人---------------\n");
		printf("-----------4.删除联系人---------------\n");
		printf("-----------5.清空联系人---------------\n");
		printf("-----------6.修改联系人---------------\n");
		printf("-----------7.退出电话簿---------------\n");
		printf("请输入对应功能的数字:\n");
		scanf("%d",&m);
		switch(m)
		{
			case 1:display(head);break;
			case 2:insert_node(head,new_node);break;
			case 3:search(head);break;
			case 4:delete_node(head);break;
			case 5:make_empty(head);break;
			case 6:mod_node(head);break;
			case 7:return 0;
		}
	}

}

makefile:

tele:main.o tele.o
	@gcc tele.o main.o -o tele

main.o:main.c
	@gcc -c main.c
tele.o:tele.c
	@gcc -c tele.c
.PHONE: clean
clean:
	@rm -f *.o tele

最后只要make就可以实现通讯录功能。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将全班同学的通讯信息存入一个单链表。元素中的通讯信息包括每一位同学的:学号、姓名、性别、宿舍、联系电话等。要求能够利用姓名和序号进行有关查找、插入、删除、更新等操作。 (1)以单链表作为存储班级通讯录的存储结构,首先需要定义一个单链表数据结构,其中每个元素是一条同学通讯信息,包括学号、姓名、性别、宿舍、联系电话等字段。 (2)将本班的通讯信息输入文本文件“通讯录.txt”中,需要实现文件读写功能。当程序启动时,需要将文件中的信息读入单链表中,当程序结束时,需要将内存中的通讯录链表中的信息重新写入文件。 (3)需要实现向单链表中追加一条通讯录记录的功能,即单链表的插入功能。通过提示信息,让用户将一条通讯录记录的各个字段信息输入内存,构成一个单链表元素,然后将其作为一个整体插入单链表最后一条记录之后,该功能在读取文件信息,创建单链表是也需要用到。 (4)需要实现查询功能,包括通过姓名查询:给定一个姓名,返回其通讯信息和在表中的位置;通过序号查询:给定一个姓名,返回其通讯信息和在表中的位置。 (5)需要实现在给定位置增加一条记录的功能,该位置可以直接设定,也可以通过查询得到,比如先查到姓名为“XXX”的学生的通讯信息在表中的位置,然后在该记录的后面插入一条新的记录。
C语言链表是一种数据结构,常用于实现通讯录管理系统,因为它可以动态地存储和管理联系人信息。以下是一个简单的C语言链表通讯录管理系统的概述: 1. **节点定义**:链表由一个个节点组成,每个节点包含联系人的姓名、电话号码或电子邮件等基本信息,以及一个指向下一个节点的指针。 ```c typedef struct Contact { char name[50]; char phone[20]; char email[50]; struct Contact* next; } Contact; ``` 2. **链表初始化**:创建一个链表头部指针,并初始化第一个节点。 ```c Contact* head = NULL; void addContact(Contact* &head, char* name, char* phone, char* email) { Contact* newNode = (Contact*)malloc(sizeof(Contact)); newNode->name = name; newNode->phone = phone; newNode->email = email; newNode->next = head; head = newNode; } ``` 3. **添加联系人**:函数用来向链表中添加新的联系人。 4. **查找联系人**:通过遍历链表,根据姓名或电话号码搜索特定的联系人。 ```c Contact* searchByName(Contact* head, char* name) { Contact* current = head; while (current != NULL) { if (strcmp(current->name, name) == 0) { return current; } current = current->next; } return NULL; } ``` 5. **删除联系人**:根据需要提供删除节点的函数,可能需要更新相邻节点的指针。 6. **遍历显示**:打印整个通讯录或显示某个联系人信息。 7. **内存管理**:记得释放不再使用的节点内存,防止内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值