作为正在学数据结构的小菜鸟,想在这分享一些数据结构学习的历程……
代码都是自己写的,没有太多的参考网上和书上的代码(自己实现以后会去看网上和书上的代码,看看自己哪里可以写的更好)
大部分都是平常的作业和实验,自己花时间写的……大牛们别嘲讽哈~
下面进入正题:
链表:
关于链表的基本概念如下(并不需要背下来,但是要能用自己的语言把它表达出来):链表(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; }