链式链表的C风格实现
头文件:
#ifndef _LINKLIST_H_
#define _LINKLIST_H_ typedef void LinkList; //将数据的类型分离,相当于句柄 //只是一个小节点 包含着位置信息!
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode; //生成一个链表
LinkList* LinkList_Create();
//删除一个链表
void LinkList_Destory(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
CPP文件:
#include "linkList.h"
#include <iostream>
using namespace std; //定义一个链表头
typedef struct _tag_LinkList
{
LinkListNode header; //定义一个头结点
int length; }tagList; //生成一个链表
LinkList* LinkList_Create()
{
tagList * ret = NULL;
ret = (tagList *)malloc(sizeof(tagList)); //分配内存
memset(ret, , sizeof(tagList)); //memset快速填充 ret->header.next = NULL; //头结点的Next指向NULL
ret->length = ;
return ret;
}
//删除一个链表
void LinkList_Destory(LinkList* list)
{
//异常处理
if (list != NULL)
{
free(list);
list = NULL;
}
return;
}
//清空一个链表
void LinkList_Clear(LinkList* list)
{
tagList *tList = NULL; if(list == NULL)
{
cout << "LinkList_Clear Err" << endl;
return;
} tList = (tagList *)list; tList->length = ;
tList->header.next = NULL;
return;
}
//链表长度
int LinkList_Length(LinkList* list)
{
tagList *tList = NULL; if(list == NULL)
{
cout << "LinkList_Length Err" << endl;
return -;
} tList = (tagList *)list; return tList->length;
}
//在某个位置插入一个节点 //链表是单向的 POS位置保存在POS-1的NEXT域里面 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
int ret = ; LinkListNode* current = NULL; //定义辅助指针变量Current tagList* tList;
if (list == NULL || node == NULL || pos <)
{
ret = -;
cout << "Insert Err" << endl;
return ret;
} tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点 for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next; //指向POS节点的前一个位置
} //node的NEXT改变 将Current的NEXT域的信息存入node的NEXT域
node->next = current->next;
//Current的NEXT域指向node 从而实现插入
current->next = node; tList->length++;
return ;
}
//获取某个位置的节点
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
int ret = ;
LinkListNode* current = NULL; //辅助节点指针变量
LinkListNode* temp = NULL;
tagList* tList;
if (list == NULL || pos <)
{
ret = -;
cout << "Get Err" << endl;
return NULL;
} tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点
for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next;
}
temp = current->next;
//返回Current的Next域为POS位置信息
return temp;
} //删除某个位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
int ret = ;
LinkListNode* current = NULL;
LinkListNode* temp = NULL; //定义中间指针变量 tagList* tList;
if (list == NULL || pos <)
{
ret = -;
cout << "Get Err" << endl;
return NULL;
} tList = (tagList*)list; current = &(tList->header);
for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next; //Current指向POS节点的前一个位置
}
//temp指针指向POS位置的节点
temp = current->next;
//将temp 也就是POS位置的NEXT域值赋给CurrentNext域 从而实现跳过删除
current->next =temp->next; tList->length--;
return temp;
}
测试函数:
#include <iostream>
#include "linkList.h"
using namespace std; typedef struct _Teacher
{
LinkListNode node; //必须在所需要的数据结构中添加LinkListNode类型的node!!
int age;
char name[];
}Teacher; int main()
{
int len = ;
int ret = ;
LinkList* list = NULL;
Teacher t1, t2, t3, t4, t5;
t1.age = ;
t2.age = ;
t3.age = ;
t4.age = ;
t5.age = ;
//创建
list = LinkList_Create();
if(list == NULL)
{
return -;
}
len = LinkList_Length(list);
//逐条插入
ret = LinkList_Insert(list, (LinkListNode*)(&t1), );
ret = LinkList_Insert(list, (LinkListNode*)(&t2), );
ret = LinkList_Insert(list, (LinkListNode*)(&t3), );
ret = LinkList_Insert(list, (LinkListNode*)(&t4), );
ret = LinkList_Insert(list, (LinkListNode*)(&t5), ); for (int i = ; i < LinkList_Length(list); i++)
{
cout << "List的遍历" << endl;
cout << "age:" << ((Teacher*)LinkList_Get(list, i))->age << endl;
}
cout << endl;
//头删
while(LinkList_Length(list) > )
{
cout << "删除的元素:" << ((Teacher*)LinkList_Delete(list, ))->age << endl;
} system("pause");
return ;
}
链式链表的C风格实现的更多相关文章
- 基于链式链表的栈链式存储的C风格实现
链式链表的头文件与CPP文件见前文 头文件: #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; //创建一个栈 L ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- 链表回文串判断&&链式A+B
有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...
- 链表回文串判断&&链式A+B
有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...
- C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...
- C语言实现链表(链式存储结构)
链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...
- 由反转链表想到python链式交换变量
这两天在刷题,看到链表的反转,在翻解体思路时看到有位同学写出循环中一句搞定三个变量的交换时觉得挺6的,一般用的时候都是两个变量交换(a,b=b,a),这种三个变量的交换还真不敢随便用,而且这三个变量都 ...
随机推荐
- struts2的@Result annotation 如何添加params,并且在页面取值
http://www.bubuko.com/infodetail-2492575.html .............................................. 标签:lai ...
- 工作的时候 用到了 获取时间 DateTime 整理了一下
获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = DateTime ...
- Windows忘记mysql的密码
1.查看mysql的安装路径 show variables like "%char%"; 路径:C:\Program Files\MySQL\MySQL Server 5.7\ 2 ...
- 最长上升子序列 O(nlogn)
题意:求一个序列中的最长上升子序列. 平常我用的是N*N做法,但是一遇到需要nlogn时,就被卡的无地自容了. 所以下定决心要学习nlogn做法. 如何实现nlongn哪? 这里要用到一个栈B,记录按 ...
- UEditor的KityFormula在IIS中部署,显示不了的解决方案
在此,首先感谢我的同事,找到了问题所在. 因Web项目中需要有输入公式的功能(高等数学中需要),普通公式插件无法满足,所以找了KityFormula这款插件. 看了下里面的公式,在数学方面确实比较全面 ...
- JAVA吃货联盟项目。
1基础通过数组.选择结构.循环等实 现吃货联盟订餐系统. 1.我要订餐: 2.查看餐袋: 3.签收订单: 4.删除订单: 5.我要点赞: 6.退出系统: public class Doy001 { p ...
- 【数据分析 R语言实战】学习笔记 第十一章 对应分析
11.2对应分析 在很多情况下,我们所关心的不仅仅是行或列变量本身,而是行变量和列变量的相互关系,这就是因子分析等方法无法解释的了.1970年法国统计学家J.P.Benzenci提出对应分析,也称关联 ...
- Redis学习笔记(一)五种数据类型
1.字符串(String) 基本操作:SET(设置).GET(获取).DEL(删除)其他操作传送门 root@localhost:~# redis-cli > set msg hello OK ...
- selenium的定位
id定位 find_element_by_id()方法通过id来定位元素 例如: find_element_by_id("kw") find_element_by_id(&quo ...
- SQL SERVER 2008 系列问题:无法访问,混合模式
转载请注明:http://www.cnblogs.com/dachen408/p/7878494.html 使用本机服务器名'.'登录,使用windows模式: 1.修改登录模式为混合模式:右键服务器 ...