数据结构与算法学习之路:简单的电话簿实现——单向链表

作为正在学数据结构的小菜鸟,想在这分享一些数据结构学习的历程……


代码都是自己写的,没有太多的参考网上和书上的代码(自己实现以后会去看网上和书上的代码,看看自己哪里可以写的更好)


大部分都是平常的作业和实验,自己花时间写的……大牛们别嘲讽哈~


下面进入正题:


链表:

关于链表的基本概念如下(并不需要背下来,但是要能用自己的语言把它表达出来):链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O⑴。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。


链表的基本操作有:创建、添加、删除、查找。下面就让我们一边实现电话簿功能,一边学习这些基本操作吧。

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

#define TRUE 1
#define FALSE 0

#define NAME_LENGTH 21
#define ADRESS_LENGTH 21
#define CONTACTS_LENGTH 128
#define PHONENUMS_LENGTH 12

typedef int Status;

//用一个Contacts结构体表示联系人,里面有姓名,电话号码,地址信息
typedef struct Contacts{
	char name[NAME_LENGTH];
	char phone_number[PHONENUMS_LENGTH];
	char adress[ADRESS_LENGTH];
}Contacts;

//这是链表的节点结构体,节点内应该有你想用链表保存的数据类型和一个指向节点的指针
typedef struct LinkList{
	Contacts person;
	LinkList* next;
}Node,*NodePtr;

void LinkList_Show(NodePtr head);
Status LinkList_Init(NodePtr head);
void LinkList_Add(NodePtr head,Contacts person);
Status LinkList_Dele(NodePtr head, Contacts person);
Status LinkList_Search(NodePtr head, Contacts person);

int main(){
	int condition;//标记对电话簿进行的操作
	NodePtr head;//链表的头指针
	Contacts temp;//要操作的联系人

	head = (NodePtr)malloc(sizeof(Node));
	LinkList_Init(head);

	while (1){
		printf("请问你要对电话簿进行什么操作:\n");
		printf("1、增加联系人\n2、删除联系人\n3、查询联系人\n");
		scanf("%d", &condition);

		switch (condition){
		case 1:
			printf("请输入被添加联系人的姓名:\n");
			scanf("%s", temp.name);
			printf("请输入被添加联系人的电话号码:\n");
			scanf("%s", temp.phone_number);
			printf("请输入被添加联系人的地址:\n");
			scanf("%s", temp.adress);

			LinkList_Add(head, temp);
			break;
		case 2:
			printf("请输入被删除联系人的姓名:\n");
			scanf("%s", temp.name);

			if (LinkList_Dele(head, temp)){
				printf("已成功删除\n");
			}
			else
				printf("找不到要被删除的联系人哦\n");
			break;
		case 3:
			printf("请输入被删除联系人的姓名:\n");
			scanf("%s", temp.name);

			if (LinkList_Search(head, temp)){
				printf("您要查找的联系人信息为:\n");
				printf("姓名:%s\n", temp.name);
				printf("电话号码:%s\n", temp.phone_number);
				printf("地址:%s\n", temp.adress);
			}
			else
				printf("没有这个人哦");
			break;
		}
	}
}

//初始化链表
Status LinkList_Init(NodePtr head){
	if (head == NULL){
		printf("Error!!!!\n");
		return FALSE;
	}
	
	head->next = NULL;
	return TRUE;
}

//链表的添加操作
void LinkList_Add(NodePtr head,Contacts person){
	NodePtr p;

	p = (NodePtr)malloc(sizeof(Node));

	while (head->next == NULL){
		head->next = p;
		p->person = person;
		p->next = NULL;
	}
}

//链表的删除操作
Status LinkList_Dele(NodePtr head, Contacts person){
	NodePtr prev = head;

	while (head->next != NULL){
		if (strcmp(head->person.name, person.name)){
			prev->next = head->next;
			free(head);
			return TRUE;
		}
		prev = head;
		head++;
	}
	return FALSE;
}

//输出链表中存储的数据
void LinkList_Show(NodePtr head){
	printf("姓名\t电话号码\t地址\n");

	while (head->next != NULL){
		printf("%s\t%s\t%s\t", head->person.name, head->person.phone_number, head->person.adress);
	}
}

//链表的搜索操作
Status LinkList_Search(NodePtr head, Contacts person){
	while (head->next != NULL){
		if (strcmp(head->person.name, person.name))
			return TRUE;

		head++;

		if (head->next == NULL){
			if (strcmp(head->person.name, person.name))
				return TRUE;
		}
	}
	return FALSE;
}


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值