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. OpenLDAP配置坎坷路

    https://segmentfault.com/a/1190000014683418 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDA ...

  2. 设置pycharm文件默认换行符onfiguring Line Separators

    http://www.jetbrains.com/help/pycharm/2016.2/configuring-line-separators.html PyCharm makes it possi ...

  3. Python核心编程(第二版)PDF

    Python核心编程(第二版) 目录 第1部分 Python核心第1章 欢迎来到Python世界1.1 什么是Python1.2 起源1.3 特点1.3.1 高级1.3.2 面向对象1.3.3 可升级 ...

  4. Swift4.0复习类型定义、类型投射等操作

    1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32   /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...

  5. 【KMP】POJ 2185 Milking Grid -- Next函数的应用

    题目链接:http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵. 题目分析:next ...

  6. Java基础教程:内部类

    Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass {   . . .   public class Nest ...

  7. PHP替代session的方法

    PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...

  8. 【转载】jmeter非GUI执行脚本+动态线程+生成HTML报告

    标明文章出处: https://blog.csdn.net/qq_38915739/article/details/83018465   本次记录是在工作中为了能更好的用jmeter进行压力测试,进行 ...

  9. Redis从认识安装到实现增删改查

    Redis从一无所知,到知道一点点 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库 --维基百科 可以简单的说,Redis就是一款高性能的NoSQL数据库 ...

  10. linux tar包追加问题

    只能已归档的文件才能追加文件. 如果tar.gz文件是如此生成:#tar -zcvf test.tar.gz  a.txt即tar.gz是压缩(-z)和归档(-c)文件,则无法给它追加文件:若果tar ...