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. jenkins下载插件Git Parameter插件

    登陆jekinse -> 点击左边菜单列表 -> 点”系统管理“ -> 下拉点”插件管理“ -> 选“可选插件”,在右上角过滤框输入”Git Parameter” -> ...

  2. g++编译时遇到问题undefined reference to

    文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件 其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp : includ ...

  3. 用python画 pareto front

    用python画 pareto front 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2D pf import os import matplotlib.pyplot as plt im ...

  4. div定位relative和absolute测试1

    div里的position定位也是比较常见的,relative是相对定位,absolute是绝对定位.如本文测试:body自带8px的margin,这里不对其进行清空.蓝色的div和红色的div分别设 ...

  5. 【转】do...while(0)的妙用

    前言 今天无意中看到这个标题,因为好奇就点进去了,不错,又学习啦... 具体内容: 1. do...while(0)消除goto语句: 2 宏定义中的do...while(0): 参考 1. 原链接_ ...

  6. 17、vue-cli3 js项目中引入ts混用(typeScript)

    说明: vue3.0搭建的项目,不过没有引入ts,后来需要用到一个插件是用ts写的,所以vue要用到ts... 一.安装typescript及loader npm install typescript ...

  7. WPF ComboBox(转)

    WPF ComboBox 创建一个ComboBox控件,并设置ComboBox控件的名称,高度,宽度.及设置ComboBox的垂直和水平对齐. <ComboBox Name="Comb ...

  8. 你应该知道的4个DSP开发支持库

    引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...

  9. idea查看接口及类的关系继承(UML)图

    选中接口或类 显示结果: 如果需要添加其他的接口或类:点击右键 添加需要的接口或类: 显示结果:

  10. laravel 为Eloquent 模型添加replace 和insert ignore 查询功能

    安装:composer require jdavidbakr/replaceable-model 在模型里引入: class model extends Model { ... use \jdavid ...