头文件:

#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风格实现的更多相关文章

  1. 基于链式链表的栈链式存储的C风格实现

    链式链表的头文件与CPP文件见前文 头文件: #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; //创建一个栈 L ...

  2. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  3. 链表回文串判断&&链式A+B

    有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...

  4. 链表回文串判断&amp;&amp;链式A+B

    有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...

  5. C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)

    一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...

  6. 线性表的Java实现--链式存储(单向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...

  7. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

  8. C语言实现链表(链式存储结构)

    链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...

  9. 由反转链表想到python链式交换变量

    这两天在刷题,看到链表的反转,在翻解体思路时看到有位同学写出循环中一句搞定三个变量的交换时觉得挺6的,一般用的时候都是两个变量交换(a,b=b,a),这种三个变量的交换还真不敢随便用,而且这三个变量都 ...

随机推荐

  1. FTP任务(重点看断点续传)

    一.FTP任务目录: 1. 多用户同时登陆:     socketserver 2. 用户登陆,加密认证: md5加密 3. 上传/下载文件,保证文件一致性:md5摘要 4. 传输过程中现实进度条 5 ...

  2. 问题: 查看某个文件的修改记录| git log 高级用法

    参考文章: git查看某个文件的修改历史 5.3 Git log 高级用法 基本步骤 git log --pretty=oneline [文件名] git show [节点] git log 两周高级 ...

  3. [aspnetcore]asp.net core程序部署到Ubuntu中的路径问题

    先标记下正确写法 new FileInfo(Environment.CurrentDirectory + "/Config/Log4net.config") 很多同行喜欢这样写: ...

  4. requests发送HTTPS请求(处理SSL证书验证)

    1.SSL是什么,为什么发送HTTPS请求时需要证书验证? 1.1 SSL:安全套接字层.是为了解决HTTP协议是明文,避免传输的数据被窃取,篡改,劫持等. 1.2 TSL:Transport Lay ...

  5. nodejs学习(3) express+socket.io

    //node var express=require('express'); var app = express(); var server = require('http').createServe ...

  6. 物体检测丨Faster R-CNN详解

    这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...

  7. auth_basic 认证

    shell > yum -y install httpd-tools # 安装 htpasswd 工具 shell > cd /usr/local/nginx-/conf shell &g ...

  8. 用vue.js重构订单计算页面

    在很久很久以前做过一个很糟糕的订单结算页面,虽然里面各区域(收货地址)使用模块化加载,但是偶尔会遇到某个模块加载失败的问题导致订单提交的数据有误. 大致问题如下: 1. 每个模块都采用usercont ...

  9. LOJ#111. 后缀排序(二分 hash)

    题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...

  10. [windows]解决Win7访问Windows 2003、XP共享慢的问题

    解决方法: 1. 修改网卡配置打开本地连接属性,点击"配置"在"高级"选项卡中,将"大型发送分载(IPv4)"的值设置成"禁用&q ...