数据结构与算法学习之路:简单的电话簿实现——单向链表
2014-10-18 10:56
645 查看
作为正在学数据结构的小菜鸟,想在这分享一些数据结构学习的历程……
代码都是自己写的,没有太多的参考网上和书上的代码(自己实现以后会去看网上和书上的代码,看看自己哪里可以写的更好)
大部分都是平常的作业和实验,自己花时间写的……大牛们别嘲讽哈~
下面进入正题:
链表:
关于链表的基本概念如下(并不需要背下来,但是要能用自己的语言把它表达出来):链表(Linked
list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O⑴。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
链表的基本操作有:创建、添加、删除、查找。下面就让我们一边实现电话簿功能,一边学习这些基本操作吧。
代码都是自己写的,没有太多的参考网上和书上的代码(自己实现以后会去看网上和书上的代码,看看自己哪里可以写的更好)
大部分都是平常的作业和实验,自己花时间写的……大牛们别嘲讽哈~
下面进入正题:
链表:
关于链表的基本概念如下(并不需要背下来,但是要能用自己的语言把它表达出来):链表(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; }
相关文章推荐
- 数据结构与算法学习之路:简单的哈希表实现(链地址法解决冲突)
- 用c++实现简单的单向链表
- c++实现单向链表反转的学习总结
- 单向链表的简单实现
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 转载的标准文档:C语言实现一个简单的单向链表list
- java学习之路——简单的工厂模式实现
- 使用内部单向链表实现的一个简单堆栈
- Python 实现简单的单向链表
- 《Delphi 算法与数据结构》学习与感悟[6]: 一个简单的"单向链表"
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 数据结构 学习笔记之:静态链表--史上最简单的C语言实现——只为掌握概念——不清楚静态链表的鸟鸟们有福了!
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 数据结构学习的简单问题(三):用链表实现多项式相加
- 单向链表的java简单实现
- C语言实现一个简单的单向链表list
- 数据结构学习中的简单问题(一):用链表方式实现的队列输出杨辉三角
- C实现简单单向链表,一次遍历查找倒数第k个节点的值
- c语言单向链表的简单实现,隐藏head节点
- 寒假自主学习项目一 - 链表(示例:简单的单向链表)