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

结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!!
答案:有些编译器 支持用结构体变量名做地址的方式但一般不推荐,因为非标准
正确的方式是用&变量名比如struct type s;那么s的地址为&s,使用&(取地址运算符) 才能得到结构体的地址。

下面d是代码!!!
#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
#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);
}

#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) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路
01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...
- 企业链表C语言实现
/* * LinkList.h * * Created on: 2019年7月20日 * Author: Administrator */ #ifndef SRC_LINKLIST_H_ #defin ...
- C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C++实现企业链表(单向链表的另外一种实现方式)
LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- C++ 数据结构 1:线性表
1 数据结构 1.1 数据结构中基本概念 数据:程序的操作对象,用于描述客观事物. 数据的特点: 可以输入到计算机 可以被计算机程序处理 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型. ...
- C语言- 基础数据结构和算法 - 循环链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 企业搜索引擎开发之连接器connector(三十)
连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法 public interface D ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
随机推荐
- 合并果子(STL优先队列)
STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...
- Python函数参数与参数解构
1 Python中的函数 函数,从数学的角度来讲是,输入一个参数,经过一个表达式的处理后得到一个结果的输出,即就是x-->y的一个映射.同样,在Python或者任何编程语言中,函数其实就是实现一 ...
- springboot依赖的一些配置:spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform
springboot里会引入很多springboot starter依赖,这些依赖的版本号统一管理,springboot有几种方案可以选择. 一.spring-boot-dependencies 有两 ...
- 微信小程序学习总结
微信小程序开发环境安装以及相关设置配置 微信小程序前端页面书写 微信小程序前端样式WXSS书写 微信小程序中事件 微信小程序自定义组件 微信小程序发起请求 微信小程序登入流程 微信小程序路由跳转 微信 ...
- javascript 对象和字符串互转
Object => String : console.log(JSON.stringify(e)); String => Object : JSON.parse(str)
- 后台模板引擎ejs与前台模板引擎artTemplate的简单介绍
动态网页是指前端页面当中的数据内容来源于后台数据库,前端的html代码会随着后台数据的变化而变化,是动态生成的.制作动态网页有两种方式,一种方式是在后台拿到前端的html模板,利用后台模板引擎(如ej ...
- Flink 从 0 到 1 学习 —— 如何自定义 Data Source ?
前言 在 <从0到1学习Flink>-- Data Source 介绍 文章中,我给大家介绍了 Flink Data Source 以及简短的介绍了一下自定义 Data Source,这篇 ...
- 3、Struts2的API访问和数据封装
一.API的访问 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的.在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Sessio ...
- Java8系列 (二) Stream流
概述 Stream流是Java8新引入的一个特性, 它允许你以声明性方式处理数据集合, 而不是像以前的指令式编程那样需要编写具体怎么实现. 比如炒菜, 用指令式编程需要编写具体的实现 配菜(); 热锅 ...
- Java基础(二十六)Java IO(3)字节流(Byte Stream)
字节流是以字节为单位来处理数据的,由于字节流不会对数据进行任何转换,因此用来处理二进制的数据. 一.InputStream类与OutputStream类 1.InputStream类是所有字节输入流的 ...