首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别

结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!!

答案:有些编译器 支持用结构体变量名做地址的方式但一般不推荐,因为非标准

正确的方式是用&变量名比如struct type s;那么s的地址为&s,使用&(取地址运算符) 才能得到结构体的地址。

下面d是代码!!!

//EnterpriseLinkList.h

#pragma once
#ifndef EnterpriseLinkList
#define EnterpriseLinkList //链表小结点
typedef struct LinkNode
{
struct 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 Delete_LinkList(LinkList* list, int pos); //获得链表的长度
int Get_LinkList_Length(LinkList* list); //查找
int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare); //打印
void Print_LinkList(LinkList* list, PRINTLINKNODE print); //释放链表内存
void Free_LinkList(LinkList* list); #endif // !EnterpriseLinkList

//EnterpriseLinkList.c

#include"EnterpriseLinkList.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//初始化链表
LinkList *Init_LinkList()
{
LinkList*list = (LinkList*)malloc(sizeof(LinkList));
list->head.Next = NULL;
list->size = ;
return list; } /*//打印函数指针
typedef void(*PRINTLINKNODE)(LinkNode *);*/ //插入
void Insert_LinkList(LinkList* list, int pos, LinkNode *data)
{
if (list == NULL) return;
if (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 Delete_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 Get_LinkList_Length(LinkList* list)
{
return list->size;
} //查找
int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare)
{
if (list == NULL)
{
printf("list == NULL");
return -;
}
if (data == NULL)
{
printf("data == NULL");
return -;
}
//辅助指针查找
LinkNode*pCurrent = list->head.Next;
int index = ;
int flag = -; while (pCurrent!=NULL)
{
if (campare(pCurrent, data) == )
{
flag = ;
break;
}
pCurrent = pCurrent->Next;
index++;
} if (flag == )
{
printf("\nFound!! ");
return index;
}
else
{ printf("Not found!!\n");
return -;
} } //打印
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 Free_LinkList(LinkList* list)
{
if (list == NULL)return;
free(list);
}

//EnterpriseLinkListMain.c

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"EnterpriseLinkList.h" typedef struct Person
{
LinkNode node;
char name[];
int age;
}Person; void Myprint(LinkNode*data)
{
Person*p = (Person*)data;
printf("name is %s age is %d \n", p->name, p->age);
}
int campare(LinkNode*data1, LinkNode*data2)
{
Person*p1 = (Person*)data1;
Person*p2 = (Person*)data2;
if (p1->age == p2->age && strcmp(p1->name,p2->name)== )
{
return ;
}
else {
return -;
}
} int main(void)
{
//创建链表
LinkList* list = Init_LinkList();
//创建数据
Person p1, p2, p3, p4, p5,p6;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ZJD");
strcpy(p4.name, "LK");
strcpy(p5.name, "eee");
strcpy(p6.name, "HHH");
p1.age = ;
p2.age = ;
p3.age = ;
p4.age = ;
p5.age = ;
p6.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);
Insert_LinkList(list, , (LinkNode*)&p6); //打印
Print_LinkList(list, Myprint);
//获得链表长度
int Linklist_size;
Linklist_size=Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //查找
Person zjd;
strcpy(zjd.name,"LK");
zjd.age = ;
printf("\nTo get LK posion wait~~~~");
int posFound = Find_LinkList_data(list, (LinkNode*)&zjd, campare);
printf("\nLK's posion %d\n \n", posFound+); //打印
Print_LinkList(list, Myprint);
//获得链表长度
Linklist_size = Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //删除结点
int pos;
printf("Enter the posion what you want to delete \n");
scanf("%d", &pos);
Delete_LinkList(list,pos); //打印
Print_LinkList(list, Myprint);
//获得链表长度
Linklist_size = Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //释放
Free_LinkList(list);
printf("\n");
system("pause");
return ;
}

C/C++企业链表的实现的更多相关文章

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

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

  2. 企业链表C语言实现

    /* * LinkList.h * * Created on: 2019年7月20日 * Author: Administrator */ #ifndef SRC_LINKLIST_H_ #defin ...

  3. C语言 - 基础数据结构和算法 - 企业链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  4. C++实现企业链表(单向链表的另外一种实现方式)

    LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...

  5. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  6. C++ 数据结构 1:线性表

    1 数据结构 1.1 数据结构中基本概念 数据:程序的操作对象,用于描述客观事物. 数据的特点: 可以输入到计算机 可以被计算机程序处理 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型. ...

  7. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  8. 企业搜索引擎开发之连接器connector(三十)

    连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法 public interface D ...

  9. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

随机推荐

  1. MRP进程起不来, 报错:ORA-00600: internal error code, arguments: [2619], [227424], [], [], [], [], [], [], [], [], [], []

    问题背景:客户数据库服务架构为一主一备,某日备库操作系统意外重启,重启后Oracle MRP进程起不来,报错:ORA-00600: internal error code, arguments: [2 ...

  2. Mac 下安装配置MongoDB讲解

    1.访问官网地址是:MongoDB Download Center | MongoDB,一般下载server的Community 版,对于一般开发人员来说已经够用了.   2.点击“DOWNLOAD( ...

  3. P3105 [USACO14OPEN]公平的摄影Fair Photography

    题意翻译 在数轴上有 NNN 头牛,第 iii 头牛位于 xi(0≤xi≤109)x_i\:(0\le x_i\le 10^9)xi​(0≤xi​≤109) .没有两头牛位于同一位置. 有两种牛:白牛 ...

  4. Real Beauty真正的美丽

    [1]Beauty is only skin-deep. Physical beauty can only be held fleetingly. Real beauty is much deeper ...

  5. 基于Spark的电影推荐系统(推荐系统~2)

    第四部分-推荐系统-数据ETL 本模块完成数据清洗,并将清洗后的数据load到Hive数据表里面去 前置准备: spark +hive vim $SPARK_HOME/conf/hive-site.x ...

  6. 像艺术家一样思考 Think Like an Artist

    艺术家是如何获得灵感,如何找到自己的独特风格和主题的? 艺术家在绘画.写作.表演或歌唱前不会去征求谁的允许,而是随心而行 要想在数字时代获得满足感,我们需要变得有创造性 1.艺术家富有事业心 艺术家是 ...

  7. webshell之一句话木马变形

    什么是一句话木马 一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能.为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令. 我们如 ...

  8. cobalt strike笔记-常用beacon扫盲

    最近还是重新补一下cs的东西 0x01 Beacon命令 Beacon Commands =============== Command Description ------- ----------- ...

  9. JedisCluster与keys/scan查找

    最近买了几个专栏,关于算法.JVM.redis,学不过来.主要是身体也不太好,视物光斑转头疼的问题出现越来越频繁.再加上早上起来嗓子痒打喷嚏.很烦. 稍记录一下redis集群的问题: 1.scan在集 ...

  10. .NET Core 3.0 里新的JSON API

    为什么需要新的JSON API? JSON.NET 大家都用过,老版本的ASP.NET Core也依赖于JSON.NET. 然而这个依赖就会引起一些版本问题:例如ASP.NET Core某个版本需要使 ...