LinkList.h

#include <windows.h>
#include <stdio.h> // 链表小结点
typedef struct LINKNODE
{
LINKNODE* next;
}LinkNode; // 链表结点
typedef struct LINKLIST
{
LinkNode head;
int size;
}LinkList; // 遍历结点的函数指针
typedef void(*PRINTLINKNODE)(LinkNode*); // 比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*); // 初始化链表
LinkList* Init_LinkList(); // 根据位置插入语一个结点
void Insert_LinkList(LinkList* list, int pos, LinkNode* data); // 根据位置删除一个结点
void RemoveByPos_LinkList(LinkList* list, int pos); // 查找结点
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare); // 返回链表的大小
int Size_LinkList(LinkList* list); // 打印链表
void Print_LinkList(LinkList* list, PRINTLINKNODE print); // 释放内存
void FreeMem_LinkList(LinkList* list);

LinkList.cpp

#include "LinkList.h"

// 初始化链表
LinkList* Init_LinkList()
{
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
list->size = ;
list->head.next = NULL;
return list;
} // 根据位置插入语一个结点
void Insert_LinkList(LinkList* list, int pos, LinkNode* data)
{
if (list == NULL || data == NULL)
{
return;
}
if (pos < || pos >= list->size)
{
pos = list->size;
}
LinkNode* pCurrent = &(list->head);
for (int i = ; i < pos; i++)
{
pCurrent = pCurrent->next;
}
data->next = pCurrent->next;
pCurrent->next = data;
list->size++;
} // 根据位置删除一个结点
void RemoveByPos_LinkList(LinkList* list, int pos)
{
if (list == NULL)
{
return;
}
if (pos < || pos >= list->size)
{
return;
}
LinkNode* pCurrent = &(list->head);
for (int i = ; i < pos; i++)
{
pCurrent = pCurrent->next;
}
pCurrent->next = pCurrent->next->next;
list->size--;
} // 查找结点
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare)
{
if (list == NULL || data == NULL)
{
return -;
}
int flag = -;
int index = ;
LinkNode* pCurrent = list->head.next;
while (pCurrent != NULL)
{
if (compare(data, pCurrent) == )
{
flag = index;
break;
}
pCurrent = pCurrent->next;
index++;
}
return flag;
} // 返回链表的大小
int Size_LinkList(LinkList* list)
{
if (list == NULL)
{
return -;
}
return list->size;
} // 打印链表
void Print_LinkList(LinkList* list, PRINTLINKNODE print)
{
if (list == NULL)
{
return;
}
LinkNode* pCurrent = list->head.next;
while (pCurrent != NULL)
{
print(pCurrent);
pCurrent = pCurrent->next;
}
} // 释放内存
void FreeMem_LinkList(LinkList* list)
{
if (list == NULL)
{
return;
}
free(list);
}

main.cpp

#include "LinkList.h"

typedef struct PERSON{
LinkNode node;
char name[];
int age;
}Person; void MyPrint(LinkNode* data)
{
Person* p = (Person*)data;
printf("Name:%s, Age:%d\n", p->name, p->age);
} int MyCompare(LinkNode* node1, LinkNode* node2)
{
Person* p1 = (Person*)node1;
Person* p2 = (Person*)node2;
if ((p1->age == p2->age) && (strcmp(p1->name, p2->name) == ))
{
return ;
}
return -;
} int main()
{
//创建链表
LinkList* list = Init_LinkList(); //创建数据
Person p1, p2, p3, p4, p5;
strcpy_s(p1.name, sizeof("aaa"), "aaa");
strcpy_s(p2.name, sizeof("bbb"), "bbb");
strcpy_s(p3.name, sizeof("ccc"), "ccc");
strcpy_s(p4.name, sizeof("ddd"), "ddd");
strcpy_s(p5.name, sizeof("eee"), "eee"); p1.age = ;
p2.age = ;
p3.age = ;
p4.age = ;
p5.age = ; //将结点插入链表
Insert_LinkList(list, , (LinkNode*)&p1);
Insert_LinkList(list, , (LinkNode*)&p2);
Insert_LinkList(list, , (LinkNode*)&p3);
Insert_LinkList(list, , (LinkNode*)&p4);
Insert_LinkList(list, , (LinkNode*)&p5); //打印
Print_LinkList(list, MyPrint);
//删除结点
RemoveByPos_LinkList(list, ); //打印
printf("---------------\n");
Print_LinkList(list, MyPrint);
printf("---------------\n"); //查找
Person findP;
strcpy_s(findP.name, sizeof("bbb"), "bbb");
findP.age = ;
int pos = Find_LinkList(list, (LinkNode*)&findP, MyCompare);
printf("位置:%d\n", pos); //释放链表内存
FreeMem_LinkList(list);
getchar();
return ;
}

C++实现企业链表(单向链表的另外一种实现方式)的更多相关文章

  1. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

  2. 用python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  3. Python3玩转单链表——逆转单向链表pythonic版

    [本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...

  4. C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)

    1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...

  5. 数据结构(1) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路

    01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...

  6. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  7. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  8. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  9. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  10. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

随机推荐

  1. IFC构件位置数据与revit模型中对应构件位置数据对比

    IFC构件位置数据与revit模型中对应构件位置数据对比

  2. j2s7s300 refers to jaco v2 7DOF spherical 3fingers

    <?xml version="1.0"?> <!-- j2s7s300 refers to jaco v2 7DOF spherical 3fingers --& ...

  3. 安卓 android studio 报错 Lint found fatal errors while assembling a release target

    报错截图如下: 解决方法:在app的build.gradle中添加如下代码 android{ lintOptions { checkReleaseBuilds false abortOnError f ...

  4. VS2010/VS2012/VS2015下openGL环境配置(转)

    按:按照下述博文,三个例子均成功. https://blog.csdn.net/so_geili/article/details/51685005 请仔细阅读每一个字. 为了学习<OpenGL超 ...

  5. CSS3 《3D骰子 压大小》

    游戏在线预览地址:http://dtdxrk.github.io/game/3d-dice/index.html js判断一个随机数大小的游戏. 本来想用canvas做的,平面的生产一个点数,感觉没啥 ...

  6. 常见问题:MySQL/B+树

    平衡二叉树 此前讲红黑树时也提到了平衡二叉树,红黑树和AVL树都是能保证树不退化的平衡二叉树,平衡二叉树采用二分思想组织数据,能大大提高单点查找数据的效率,其组装过程略. 作为对比,此处也列出平衡二叉 ...

  7. jenkins最新版下载安装

    前提:安装配置 jetty 在线下载jetty# wget http://download.eclipse.org/jetty/8.1.17.v20150415/dist/jetty-distribu ...

  8. 《ucore lab7》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码) 题目 完成练习0后,建议大家比较一下(可用meld等文件dif ...

  9. 015 Android md5密码加密及其工具类

    1.md5加密介绍 MD5算法是广泛使用的杂凑函数,也就是哈希函数,英文全拼是:Message Digest Algorithm,对应的中文名字是消息摘要算法. MD5加密:将字符串转换成 32位的字 ...

  10. SQL映射器Mapper接口(MyBatis)

    SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现.直接把以前的dao接口定义成符合规则的Mapper. 注意事项: 1.接口必须以Mapper结尾,名字是Dom ...