// 企业链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 链表改进版 企业常用#include <iostream>
#include<stdlib.h>//链表小节点 不包含数据域
typedef struct linknode {struct linknode* next;
}linknode;
//链表节点  数据指针分离的设计
typedef struct linklist {linknode head;int size;
}linklist;//typedef struct mydata {
//    linknode node;//首地址
//    char name[64];
//    int age;
//}mydata;//企业链表数据结构声明,必须在第一个位置声明节点,开始串联数据(防止产生偏移量)
typedef struct PERSON {linknode node;char name[64];int age;
}person;void Myprint(linknode* data) {person* p = (person*)data;printf("name=%s,age=%d\n", p->name, p->age);
}//遍历函数指针
typedef void(*PRINTNODE)(linknode*);//比较函数指针
typedef int(*COMPARENODE)(linknode*, linknode*);linklist* Inint_linklist() {linklist* list = (linklist*)malloc(sizeof(linklist));list->head.next = NULL;list->size = 0;return list;
}void Insert_linklist(linklist* list, int pos,linknode* data) {if (list == NULL) {return;}if (data == NULL) {return;}if (pos < 0 || pos>list->size) {pos = list->size;}//查找插入位置linknode* pcur = &(list->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}//插入新节点data->next = pcur->next;pcur->next = data;list->size++;
}void Remove_linklist(linklist* list, int pos) {if (list == NULL) {return;}if (pos<0 || pos>=list->size) {return;}//linknode* pcur = &(list->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}//删除节点pcur->next = pcur->next->next;list->size--;
}
//COMPARENODE compare 回调函数
int Find_linklist(linklist* list, linknode* data, COMPARENODE compare) {if (list == NULL) {return 0;}if (data==NULL) {return 0;}//辅助指针变量linknode* pcur = list->head.next;int index = 0;int flag = -1;while (pcur != NULL) {if (compare(pcur, data) == 0) {flag = index;break;}pcur = pcur->next;index++;}return flag;
}int Size_linklist(linklist* list) {return 0;
}void Print_linklist(linklist* list,PRINTNODE print) {if (list == NULL) {return;}linknode* pcur = list->head.next;while(pcur != NULL) {print(pcur);pcur = pcur->next;}
}void Free_linklist(linklist* list) {if (list == NULL) {return;}free(list);
}int mycompare(linknode* node1, linknode* node2) {person* p1 = (person*)node1;person* p2 = (person*)node2;if (strcmp(p1->name, p2->name) == 0 && p1->age==p2->age) {return 0;}return -1;
}
int main()
{linklist* list = Inint_linklist();person p1, p2, p3, p4, p5;strcpy_s(p1.name, "aaaa");strcpy_s(p2.name, "bbbb");strcpy_s(p3.name, "cccc");strcpy_s(p4.name, "dddd");strcpy_s(p5.name, "eeee");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;Insert_linklist(list, 0, (linknode*)&p1);Insert_linklist(list, 0, (linknode*)&p2);Insert_linklist(list, 0, (linknode*)&p3);Insert_linklist(list, 0, (linknode*)&p4);Insert_linklist(list, 0, (linknode*)&p5);Print_linklist(list,Myprint);printf("-----------------------\n");Remove_linklist(list,2);Print_linklist(list, Myprint);printf("-----------------------\n");//查找person findx;strcpy_s(findx.name, "bbbb");findx.age = 20;int pos= Find_linklist(list, (linknode*)&findx, mycompare);printf("position=%d\n",pos);printf("-----------------------\n");//释放内存Free_linklist(list);system("pause");return 0;
}

【C++】【四】企业链表相关推荐

  1. Python数据结构 四种链表的集合

    python数据结构四个链表的集合 结点的创建 import os# 创建节点 class Node:def __init__(self, data):self.data = dataself.nex ...

  2. 插入始终是1_C++入门篇(四十四),链表查询与结点插入

    链表的查询 对链表进行各种操作时,需要先对某一个结点进行查询定位.假设数据中没有数据相同的结点,我们可以编写这样一个函数,查找到链表中符合条件的结点,我们在四十三篇的代码中声明搜索结点函数原型: 在底 ...

  3. 企业架构之道(四)企业架构Zachman方法

    --软件架构是多角度多形式的 Zachman框架由约翰 扎科曼(John Zachman )在1987年创立的全球第一个企业架构理论,其论文<信息系统架构框架>至今仍被业界认为是企业架构设 ...

  4. java基础之面试篇四-单向链表和双向链表区别

    区别主要在头结点,for遍历,有无前驱结点地址. 单向链表的头结点不是哑元(哑元的意思是能不能从头节点遍历,能则不是哑元),遍历的时候要第二次才能进入for循环,第一次需要去找表头,无前驱结点地址,只 ...

  5. 牛客网(剑指offer) 第十四题 链表中倒数第k个节点

    //题目描述:输入一个链表,输出链表该链表中倒数第k个节点. <?php /*class ListNode{var $val;var $next = NULL;function __constr ...

  6. C语言学习笔记—链表(四)链表的删除

    删除节点 链表的节点删除有两种情况 一.删除头节点 将头结点变为第二个节点即可. 二.删除非头节点 将要删除的节点的前一个节点指向到要删除的节点的下一个节点. #include <stdio.h ...

  7. python 释放链表节点_四种常见链表的实现及时间复杂度分析(Python3版)

    四种常见的链表包括:单向链表,单向循环链表,双向链表,双向循环链表. 要实现的链表操作包括 - is_empty() 判断链表是否为空 - length() 求链表长度 - traversing() ...

  8. c语言的链表实验总结,链表实现集合实验报告_相关文章专题_写写帮文库

    时间:2019-05-15 10:09:12 作者:admin <数据结构>实验报告二 分校:学号:日期:班级: 姓名: 程序名: L2311.CPP 一.上机实验的问题和要求: 单链表的 ...

  9. Innodb Buffer Pool的三种Page和链表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 王航威 来源 | 公众号「yangyidba」 ...

最新文章

  1. MySQL数据库中as和distinct关键字
  2. petalinux2020.1 uboot 无法正常加载的问题
  3. O029、教你看懂OpenStack日志
  4. 华为手机如何升级鸿蒙系统_华为手机怎么升级鸿蒙系统?答案来了
  5. HDU - 4513 吉哥系列故事——完美队形II(Manacher)
  6. Docker镜像的目录存储讲解
  7. 需求分析与建模最佳实践_社交媒体和主题建模:如何在实践中分析帖子
  8. 工业互联网的两种极端想法和两点反思
  9. 中天数相减获得差_Power BI 了解DAX中LASTDATE和MAX之间的区别
  10. android 拍摄二维码图片 变形矫正_鼻中隔先天偏曲矫正特殊案例——我为何给她做了两次手术...
  11. mysql 超时_为MySQL设置查询超时
  12. ios 中如何应对UIScrollView快速滑动(暴力用户,暴力测试)
  13. [mark] first shellcode
  14. 分布式设计 —— 容错与主备
  15. unity3d api 中文文档_官方文档
  16. 设计模式——装饰模式Decorate
  17. python 第二天
  18. cairo学习简单总结
  19. 6、Spring事务配置上篇
  20. leetcode 78.不含重复元素数组的子集

热门文章

  1. hashmap value可以为空吗_美团面试题:Hashmap结构,1.7和1.8有哪些区别(最详细解析)...
  2. datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
  3. 江苏开放大学计算机应用基础第四次作业,江苏开放大学-计算机应用基础第四次.doc...
  4. python数据转换函数_常用python数据类型转换函数总结
  5. 高精地图:为自动驾驶汽车提供动力的新时代地图
  6. 解决Qt+OpenGL更换图像纹理的问题
  7. Udacity机器人软件工程师课程笔记(十三)-运动学-机械手介绍及分类
  8. 设置VSCode用Ctrl+鼠标滚轮上下滑动调整编辑器代码字体大小,设置Ctrl+0恢复默认字体大小
  9. 在CentOS 6.3 64bit上安装ActiveMQ 5.15.9实录
  10. boost::asio使用UDP协议通信源码实现