C++实现企业链表(单向链表的另外一种实现方式)
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++实现企业链表(单向链表的另外一种实现方式)的更多相关文章
- Python 单向链表、双向链表
用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...
- 用python实现单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...
- C#数据结构与算法系列(六):链表——双链表(Double-LinkedList)
1.对比单向链表 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除 对于单向链表的删除,我们首先要找到单向链表待删除节点的 ...
- 数据结构(1) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路
01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
- Linus:利用二级指针删除单向链表
Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...
- 【转】Linus:利用二级指针删除单向链表
原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...
随机推荐
- Jmeter 时间函数工具汇总
在使用Jmeter过程中,常使用的函数汇总 __time : 获取时间戳.格式化时间 ${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成时间格式 2018- ...
- shared_ptr的使用和陷阱
shared_ptr的使用和陷阱 shared_ptr的使用 分配内存 make_shared //make_shared<int>分配一块int类型大小的内存,并值初始化为100 //返 ...
- 【DataBase】Hsqldb的简单使用
介绍 HSQLDB是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速的.具有Server模式,每个程序需要不同的命令来运行. HyperSQL ...
- 【Mybatis】MyBatis之缓存(七)
MyBatis缓存介绍 Mybatis 使用到了两种缓存:一级缓存(本地缓存.local cache)和二级缓存(second level cache). 一级缓存:基于PerpetualCache ...
- Linux的桌面虚拟化技术KVM(二)——远程桌面管理
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 远程桌面管理,指的是远程图形界面管理,所以要保证物理机要有图形化界面. (1).VNC管理 安装VNC-server服务,并进行配置 [ro ...
- Python手册 3.7
Python手册 3.7 下载地址:https://pan.baidu.com/s/1dPzwwP3ehnyLUNWTsB2QJg 关注微信公众号获取提取码: 输入:py99 获取提取码
- Error:java: Compilation failed: internal java compiler
errorInformation:java: javacTask: 源发行版 1.8 需要目标发行版 1.8 解决此类问题 检查自己的JDK是否一致 1 setting--------built ...
- ubuntu18.04安装DB2 11.1 Express-c
参考连接:https://developer.ibm.com/answers/questions/280797/download-db2-express-c-105-1/ 这个参考页面提供了DB2 E ...
- 【Leetcode_easy】941. Valid Mountain Array
problem 941. Valid Mountain Array solution: class Solution { public: bool validMountainArray(vector& ...
- html div高度100%无效
移动端相关: div高度继承自父元素——>body——>html 解决方案: html,body { height: 100%;margin: 0; padding: 0;} 然后对应的d ...