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企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
随机推荐
- RF中的if判断
关键字run keyword if 格式如下: Run Keyword If 判断条件 其他关键字 ... ELSE IF 判断条件 其他关键字 ... ELSE ...
- Kali升级2018&&2019
0X01修改更新源 vim /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-f ...
- PHP get_class_vars 和 (array)
<?php class Girl { public $id = 1; public $name = 'zhy'; } $start = microtime(TRUE); var_dump(get ...
- [CF431C]k-Tree
题目描述 Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was ins ...
- 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)
需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...
- opencv::视频人脸检测
视频流抓取人脸和眼睛 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using nam ...
- Grid实现table表格布局
HTML <div class="table"> <div class="th"> <div>日期</div> ...
- 百万年薪python之路 -- 并发编程之 多线程 一
多线程 1.进程: 生产者消费者模型 一种编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后遇到类似的情况,套用即可 生产者与消费者模型的三要素: 生产者:产生数据的 消费者:接收数据 ...
- 手绘风格的 JS 图表库:Chart.xkcd
本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...
- 解决html连续字符或数字换行的问题
word-break: break-all; word-wrap:break-word; 强制换行