头文件:

#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. 洛谷 P1954 [NOI2010]航空管制

    https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...

  2. morphia(3)-查询

    1.查询所有 @Test public void query() throws Exception { final Query<Employee> query = datastore.cr ...

  3. python regex

    re.match: match from the beginning of the string re.search: scan through the whole string to find a ...

  4. python学习之IO:

    输入输出兼程IO操作,有同步(速度不匹配时四等)和异步(轮询和消息通知,复杂而高效) 一 文件操作函数: 文件打开:f=open("文件路径“,“操作类型 r/rb/w/a”,"编 ...

  5. 06.Javascript——入门this的用法(难点)

    this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 1.作为普通函数调用 当函数作为一 ...

  6. Vue 简单实用---代码可以直接用

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  7. 关于.NET .cs后台提示并进行页面跳转代码

    在后台.CS页面中植入下面代码 string url = "<script>alert('xxx');window.location.href='"xxx.html&q ...

  8. [转]AngularJS Cookies Example

    AngularJS Cookies Example AngularJS 提供了很好的 $cookie 和 $cookieStore API 用来处理 cookies . 这两个服务都能够很好的发挥HT ...

  9. Java基础之入门介绍

    基础知识 1.JVM.JRE和JDK的区别:     JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性.                   java ...

  10. leetcode287 Find the Duplicate Number

    思路: 转换成链表之后使用floyed判环法.转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点. 实现: class Solution { public: int fin ...