头文件:

#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. GYM 101889E(dp)

    dp[i][j][k]表示第i位填数字k时,与后面的相连模数为j时,后面的数字最小填多少. 测得我提心吊胆还以为复杂度高了,结果出来46ms还是cf评测姬强啊. #pragma comment(lin ...

  2. java中代码执行顺序

    静态代码块 -- >构造代码块 --> 构造方法静态代码块:只执行一次构造代码块:每次调用构造方法都执行 http://blog.csdn.net/wuhaiwei002/article/ ...

  3. 持续集成~Jenkins里的NuGet和MSBuild插件

    Jenkins是一个持续集成的环境,它是java开发的,大叔认为它的工作流程是 从源代码拉一个项目下来到它本地(可以配置定时机制) 恢复相关程序包nuget 编译程序 发布程序 现在说一下在配置jen ...

  4. spring mvc 获取所有注册的url

    背景:坑货同事写代码一点规范都没有,瞎写,根据url没法直接定位到方法,无奈产生了此接口,程序员何苦为难程序员呢 @Autowired private RequestMappingHandlerMap ...

  5. Log4j日志框架小记

    人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...

  6. 简单的UDP程序

    接受端: package com.dcz.udp; import java.io.IOException; import java.net.DatagramPacket; import java.ne ...

  7. 从零开始利用vue-cli搭建简单音乐网站(七)

    这几天完成了歌曲收藏功能,先看最后效果: 新注册用户:“newuser”,进入“我的音乐界面如下所示” 点击新建歌单,输入:“新歌单”,确认,如下: 目前还没有歌曲,打开音乐界面,点击收藏功能,如下, ...

  8. Java类的静态块の二

    在上一篇Java类的静态块の一中介绍到:类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次. 但是在下面的例子中却发现JVM并不是把把所有的static模块都执行完成再执行其他(Java果然 ...

  9. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  10. POJ 1739 Tony's Tour (插头DP,轮廓线DP)

    题意:给一个n*m的矩阵,其中#是障碍格子,其他则是必走的格子,问从左下角的格子走到右下角的格子有多少种方式. 思路: 注意有可能答案是0,就是障碍格子阻挡住了去路. 插头DP有两种比较常见的表示连通 ...