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. IDEA 修改某个Module名称

    一.选择module右键——>Refactor——>Rename 二.修改该module下的pom.xml文件对应module名改掉 三.修改项目的pom文件中modules里的modul ...

  2. Qt连接数据库

    Qt连接数据库,参数设置 //连接数据库 bool VCManageDatabase::connectMYSQL() { //判断testConnect连接是否存在并连接 if (QSqlDataba ...

  3. Django model中的save后的return

    先给结论吧:在Django model的操作函数中,obj.save()后再执行return obj会返回obj的ID. 看例子: ... def create_session(self,bind_h ...

  4. Embedding Layer

    在深度学习实验中经常会遇Eembedding层,然而网络上的介绍可谓是相当含糊.比如 Keras中文文档中对嵌入层 Embedding的介绍除了一句 “嵌入层将正整数(下标)转换为具有固定大小的向量” ...

  5. SqlServer触发器常用语法AFTER、INSTEAD OF及其详解

    先创建一个简单的触发器 CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR | AFTER | INSTEAD OF [DE ...

  6. vi 替换命令 以及“找不到模式”解决

    转自:https://www.cnblogs.com/zfyouxi/p/5181363.html 在linux vi编辑工具中使用替换命令操作时,会出现明明有匹配查找模式的数据.却报“找不到模式”问 ...

  7. 【计算机视觉】基于局部二值相似性模式(LBSP)的运动目标检测算法

    基于局部二值相似性模式(LBSP)的运动目标检测算法 kezunhai@gmail.com http://blog.csdn.net/kezunhai 本文根据论文:Improving backgro ...

  8. 【CUDA开发】CUDA面内存拷贝用法总结

    [CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...

  9. windows下连接mysql提示1044-access denied for root''@'localhost' to database

    ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mydb'. 原因是因为mysql数据库的user表里,存 ...

  10. activeMq学习应用

    一.下载 ActiveMQ 5.15.0下载地址 二.安装 解压apache-activemq-5.15.0-bin.zip D:\apache-activemq-5.15.7-bin\apache- ...