C_数据结构_链表的链式实现
传统的链表不能实现数据和链表的分离,一旦数据改变则链表就不能用了,就要重新开发。
如上说示:外层是Teacher,里面小的是node.
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_ typedef void LinkList;//链表上下文,任意类型 typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;//包含下一个节点的地址
}LinkListNode;//节点 LinkList* LinkList_Create(); void LinkList_Destroy(LinkList* list); void LinkList_Clear(LinkList* list); int LinkList_Length(LinkList* list); int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); LinkListNode* LinkList_Get(LinkList* list, int pos); LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linklist.h" typedef struct _tag_LinkList//这个链表的上下文信息,类似于handle.这里面是链表的头结点和链表的长度。
{
LinkListNode header;
int length;
}TLinkList; LinkList* LinkList_Create() //O(1)
{
TLinkList *tmp = NULL; tmp = (TLinkList *)malloc(sizeof(TLinkList));
if (tmp == NULL)
{
printf("func LinkList_Create() err \n");
return NULL;
}
memset(tmp, , sizeof(TLinkList));
tmp->length = ;
tmp->header.next = NULL; //
return tmp;
} void LinkList_Destroy(LinkList* list) //O(1)
{
if (list == NULL)
{
return ;
}
free(list);//只把上下文信息释放。因为加进去的Teacher对象是局部的,main函数执行完后会自动释放,所以这里不用手动释放。
return ;
} void LinkList_Clear(LinkList* list) //O(1)
{
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (tList == NULL)
{
return ;
}
tList->header.next = NULL;
tList->length = ; return ;
} int LinkList_Length(LinkList* list) //O(1)
{
TLinkList *tList = NULL;
tList = (TLinkList *)list;
if (tList == NULL)
{
return -;
}
return tList->length;
} int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //在pos位置插入节点,先连接后面的再连接前面的。
{
int i = ;
LinkListNode *current = NULL;
TLinkList *tList = NULL;
if (list==NULL || node==NULL || pos<)//node为新节点
{
return -;
}
tList = (TLinkList *)list; current = &(tList->header);//节点要取地址给指针
for (i=; i<pos; i++)//链表节点序号从0开始
{
current = current->next;//current为pos位置前面的节点
}
//先连接后面节点在连接前面节点
node->next = current->next; //前面的链表 连接 新结点
current->next = node; tList->length ++;
return ;
} LinkListNode* LinkList_Get(LinkList* list, int pos) //O(n)
{
int i = ;
LinkListNode *current = NULL;
TLinkList *tList = NULL; tList = (TLinkList *)list; if (list==NULL || pos<)
{
return NULL;
} current = &(tList->header); //赋值指针变量初始化
for (i=; i<pos; i++)
{
current = current->next;
}
return current->next;
} LinkListNode* LinkList_Delete(LinkList* list, int pos) //O(n)
{
int i = ;
LinkListNode *current = NULL;
LinkListNode *ret = NULL;
TLinkList *tList = NULL; tList = (TLinkList *)list;
if (list==NULL || pos<)
{
return NULL;
} current = &(tList->header);
for (i=; i<pos; i++)
{
current = current->next;
}
ret = current->next; //缓存要删除的结点 current->next = ret->next; tList->length --; return ret;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linklist.h" /*
typedef struct _Node
{
struct _Node *next;
}Node; typedef struct _Teacher1
{
char name[32];
int age ;
Node node;
}Teacher1; typedef struct _Teacher2
{
Node node;
char name[32];
int age ; }Teacher2; Teacher2 t2;
*/ typedef struct _Teacher
{
LinkListNode node; //偏移量:从node元素找到Teacher的地址。写到上面则node的内存首地址和Teacher对象的内存首地址重叠了。
char name[];
int age ;
}Teacher; void main()
{
LinkList *list = NULL;
int i = ; Teacher t1, t2, t3, t4, t5, t6;//main函数结束这几个变量释放
t1.age = ;
t2.age = ;
t3.age = ;
t4.age = ;
t5.age = ;
t6.age = ; list = LinkList_Create(); //思考1: 业务节点 和 链表算法是如何分离
//思考2: 业务节点的生命周期 归谁管... //插入元素
LinkList_Insert(list, (LinkListNode *)&t1, );//t1地址和node地址是重叠的
LinkList_Insert(list, (LinkListNode *)&t2, );
LinkList_Insert(list, (LinkListNode *)&t3, );
LinkList_Insert(list, (LinkListNode *)&t4, );
LinkList_Insert(list, (LinkListNode *)&t5, );
LinkList_Insert(list, (LinkListNode *)&t6, ); //遍历链表
for (i=; i<LinkList_Length(list); i++)
{
Teacher *tmp = (Teacher *)LinkList_Get(list, i);
if (tmp == NULL)
{
return ;
}
printf("age:%d \n", tmp->age);
} //删除链表结点
while (LinkList_Length(list) > )
{
Teacher *tmp = (Teacher *)LinkList_Delete(list, );
if (tmp == NULL)
{
return ;
}
printf("age:%d \n", tmp->age);
} LinkList_Destroy(list); printf("hello...\n");
system("pause");
return ;
}
C_数据结构_链表的链式实现的更多相关文章
- c_数据结构_链表
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define OVERFLOW -2 ty ...
- C语言实现链表(链式存储结构)
链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- C++实现链队类——合肥工业大学数据结构实验5:链式队列
实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...
- c_数据结构_队的实现
# 链式存储#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 #defin ...
- C_数据结构_链式二叉树
# include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- c_数据结构_图_邻接表
课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_4_数据结构_链表
查询慢,增删快. 绿色代表一条链 红色是另外一条链 .查询是从头开始查所以慢. 在300和55之间添加一个元素
随机推荐
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
- Fiddler的基本介绍
fiddler 简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断 ...
- mysql中增加某一时间段内的时间数据(包含:时间、年、月、日、第几周、季度)
创建表dim_date: create table `dim_date` ( `year` int (20), `month` int (20), `day` int (20), `week` int ...
- 学习面试题Day06
1.字节流的处理方式 字节流处理的是计算机最基本的单位byte,它可以处理任何数据格式的数据.主要的操作对象就是byte数组,通过read()和write()方法把byte数组中的数据写入或读出. 2 ...
- 临时禁用Resharper
Visual Studio 菜单 –> 工具 –> 选项 –> ReSharper –> Suspend按钮
- BestCoder Round #68 (div.2) 1002 tree
题意:给你一个图,每条边权值0或1,问每个点周围最近的点有多少个? 思路:并查集找权值为0的点构成的连通块. #include<stdio.h> #include<string.h& ...
- Redhat Enterprise Linux 6.4图形界面的中文问题
一.界面中文,但Windows中的中文文件名上传到linux后乱码. .bashrc文件: export LANG=zh_CN.UTF-8 /etc/sysconfig/i18n文件: LANG=&q ...
- 转载 深入理解JavaScript中的this关键字
转载原地址: http://www.cnblogs.com/rainman/archive/2009/05/03/1448392.html 深入理解JavaScript中的this关键字 1. 一 ...
- 如何让Iconfont作用到content伪类中
沿用同行思密达的方法整理了一下;前提是先引入iconfont字体图标(引用线上iconfont查看上篇随笔):比如 其中&#是开头用以标明这是字符实体,x表示这是十六进制,而CSS的cont ...
- uLua学习笔记(一):uLua安装及上手
uLua下载:http://www.ulua.org/ VS2012/2013的用于编写Lua的插件:https://babelua.codeplex.com/或http://unknownworld ...