首先 先介绍企业链表 和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. 原生js动态创建、获取、删除属性的几种方式

    1.创建属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  2. HashTable、Dictionary、ConcurrentDictionary三者区别

    转载自https://blog.csdn.net/yinghuolsx/article/details/72952857 1.HashTable HashTable表示键/值对的集合.在.NET Fr ...

  3. 移动端网页常用meta

    今天在对前公司的某直播室前端进行改版时,整理了一下平时移动端页面开发时,最常用的meta.如下: <!--定义页面制作者,可以留姓名,也可以留联系方式--> <meta name=& ...

  4. hibernate之小白一

    关于hibernate框架,以下是我自己的见解,每个人的理解各不同,希望各位读者根据自己的需要来查询自己想要的.以下我来给你们分享我学习hibernate的一些理论和实践: 首先我们来了解一下hibe ...

  5. 解决 canvas 将图片转为base64报错: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasEleme...

    问题描述 当用户点击分享按钮时,生成一张海报,可以保存图片分享到朋友圈,用户的图片是存储在阿里云的OSS,当海报完成后,执行.canvas.toDataURL("image/png" ...

  6. 聊聊db和缓存一致性的5种实现方式

    数据存储在数据库中,为了加快业务访问的速度,我们将数据库中的一些数据放在缓存中,那么问题来了,如何确保db和缓存中数据的一致性呢?我们列出了5种方法,大家都了解一下,然后根据业务自己选择. 方案1 获 ...

  7. samba文件共享服务部署

    1.安装samaba服务程序 yum install -y samba 2.查看smaba文件,由于注释空行较多,选择过滤 egrep -v "#|;|^$" /etc/samba ...

  8. std::wstring

    std::wstring主要用于 UTF-16编码的字符, std::string主要用于存储单字节的字符( ASCII字符集 ),但是也可以用来保存UTF-8编码的字符. UTF-8和UTF-16是 ...

  9. 关于vue使用的一些小经验

    这一年来说,vue的势头很猛,用户量“噌”“噌”“噌”的涨 为了不掉队不落伍.在后台大哥的胁迫下,不得不选择用了它 刚开始很难接受vue的写法,在编辑器里很容易报错,基本上每行都会出现红色的波浪线 这 ...

  10. linux-查看服务器内存使用情况(free top)

    free命令:显示系统使用和空闲的内存情况,包括物理内存.交互区内存(swap)和内核缓冲区内存. [root@ipha-dev71- workspace]# free # kb total used ...