您的位置:首页 > 理论基础 > 数据结构算法

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

2014-10-18 10:56 645 查看
作为正在学数据结构的小菜鸟,想在这分享一些数据结构学习的历程……

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

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

下面进入正题:

链表:

关于链表的基本概念如下(并不需要背下来,但是要能用自己的语言把它表达出来):链表(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: