// 单向链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<stdlib.h>typedef struct LINKNODE {void* data;struct LINKNODE* next;
}linknode;typedef struct LINKLIST {LINKNODE* head;int size;
}linklist;
//print function ptr
typedef void(*PRINTLINKNODE)(void*);//init
linklist* Init_linklist() {linklist* list = (linklist*)malloc(sizeof(linklist));list->size=0;//头节点,方便判断位置list->head = (linknode*)malloc(sizeof(linknode));list->head->data = NULL;list->head->next = NULL;return list;
}void Insert_linklist(linklist* list, int pos, void* data) {if (list == NULL) {return;}if (data == NULL) {return;}if (pos < 0 || pos > list->size) {pos = list->size;}//创建新节点linknode* newnode = (linknode*)malloc(sizeof(linknode));newnode->data = data;newnode->next = NULL;//查找待插入位置    //遍历位置    //辅助指针变量linknode* pcur = list->head;for (int i = 0; i < pos; ++i) {pcur = pcur->next;}//插入  newnode->next = pcur->next;pcur->next = newnode;list->size++;
}void RemoveByPos_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;}linknode* pdel = pcur->next;pcur->next = pdel->next;free(pdel);list->size--;
}void RemoveByValue_linklist(linklist* list, void* data) {}int Size_linklist(linklist* list) {return list->size;
}int Find_list(linklist* list, void* data) {if (list == NULL) {return -1;}if (data == NULL) {return-1;}//遍历查找linknode* pcur = list->head->next;int i = 0;while (pcur != NULL) {if (pcur->data == data) {break;}i++;pcur = pcur->next;}return i;
}
//返回第一个节点
void* Front_linklist(linklist* list) {return list->head->next->data;
}void Free_linklist(linklist* list) {if (list == NULL) {return;}linknode* pcur = list->head;while (pcur != NULL) {linknode* pnext = pcur->next;free(pcur);pcur = pnext;//move node/ptr}list->size = 0;free(list);
}void Print_linklist(linklist* list,PRINTLINKNODE print) {if (list == NULL) {return;}//节点遍历linknode* pcur = list->head->next;while (pcur != NULL) {//调用户传进来的函数print(pcur->data);pcur = pcur->next;}
}typedef struct PERSON {char name[64];int age;int score;
}person;void myprint(void* data) {person* p = (person*)data;printf("name:=%s,age=%d,score=%d\n", p->name, p->age, p->score);
}int main()
{linklist* list = Init_linklist();person p1 = { "aaa",18,100 };person p2 = { "bbb",19,99 };person p3 = { "ccc",20,101 };person p4 = { "ddd",17,97 };person p5 = { "eee",16,59 };Insert_linklist(list, 0, &p1);Insert_linklist(list, 0, &p2);Insert_linklist(list, 0, &p3);Insert_linklist(list, 0, &p4);Insert_linklist(list, 0, &p5);//打印Print_linklist(list, myprint);printf("-------------------------------\n");//删除RemoveByPos_linklist(list, 3);Print_linklist(list, myprint);printf("-------------------------------\n");//返回第一个节点person* ret =(person*)Front_linklist(list);printf("name=%s,age=%d,score=%d\n", ret->name, ret->age, ret->score);printf("-------------------------------\n");//销毁Free_linklist(list);system("pause");return 0;
}

【C++】【三】单向链表相关推荐

  1. 已知p是一个指向类a的数据成员m的指针_第三十八章、结构体指针、单向链表简介...

    最近比较忙,一下子有好几天没更新了,今天我们先来了解下结构体指针. 和普通的指针一样,结构体指针就是指向结构体变量的指针. 结构体指针指向的是结构体变量的起始位置. 1. 声明结构体指针 我们用一幅图 ...

  2. JavaScript的数据结构与算法(三) —— 单向链表

    链表 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个元素由一个存储元素本事的节点和一个指向下一个元素的引用组成.相对于传统的数组,链表的一个好处在于,添加或者删除元素 ...

  3. 基础数据结构【二】————动态数组,单向链表及链表的反转

    DEMO1:     动态分配变量(链表,而静态数组是线性表,意味着动态数组访问和遍历复杂度为O(n),而插入和删除复杂度为O(1),而静态数组线性表则完全相反) int* intptr = new ...

  4. C语言单向链表的实现

    一个简单结点的结构体表示为: struct note { int  data:              /*数据成员可以是多个不同类型的数据*/ struct  note  *next:      ...

  5. C++11中std::forward_list单向链表的使用

    std::forward_list是在C++11中引入的单向链表或叫正向列表.forward_list具有插入.删除表项速度快.消耗内存空间少的特点,但只能向前遍历.与其它序列容器(array.vec ...

  6. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)

    题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.调整后的节点顺序要保持与原链表中节点的先后次序一 ...

  7. 数据结构——求单向链表的倒数第K个节点

    首先,对于链表来说,我们不能像数组一样直接访问,所以我们想到要求倒数第K个节点首先要知道最后一个节点. 然后从最后一个节点往前数K个. 最后得到想要的值. 但是这是不对的,为什么呢?因为题目给出的是单 ...

  8. java实现单向链表

    一.单向链表的结构. (1).首先节点的结构,其中包含本节点内容,以及需要指向下一个节点. Java代码 private static class Entry<E>{ E e; Entry ...

  9. JS版数据结构第三篇(链表)

    链表分为单链表,双链表,以及环形链表,我将分三个模块分别介绍,并有相应的题目对应讲解. 单链表 定义 还是按照老规矩先看一下百度百科对单链表的定义 根据以上文字我们可以得出 单链表是一种链式的数据结构 ...

最新文章

  1. 我的C#学习笔记(1)
  2. ionic4中的手势事件
  3. 如何用python画圆形的代码-简单实现python画圆功能
  4. 34、Power Query-中国式排名
  5. c/c++如何正确使用结构体?
  6. 关于浮点数精度的问题
  7. android京东首页轮播代码,仿京东商品详情轮播图
  8. App热补丁动态修复技术介绍
  9. 使用apache mod_env模块保存php程序敏感信息
  10. Windows server 2003-2016镜像下载
  11. Tampermonkey油猴脚本安装及入门
  12. 我要用生锈的机关枪击穿现在
  13. 学以致用——Excel报表自动化方案 (Automation solution of complicated manual Excel Report)
  14. 微软向开发者免费提供的Windows 10虚拟机镜像
  15. 离散数学 数学三大危机
  16. 笔试 | 数字IC设计之1bit的半加器、全加器实现
  17. CRC-CCITT16(0xFFFF、XModem、0x1D0F、Kermit)
  18. 51单片机 特殊功能寄存器(SFR) SBUF使用方法
  19. 函数对称性常见公式_函数的各种对称性
  20. 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

热门文章

  1. java为什么实现_为什么在java中这样实现了这样的实现?
  2. java数组与字符串编程及答案_04747_Java语言程序设计(一)_第4章_数组和字符串...
  3. mysql编码不对_MySQL编码不一致导致乱码问题总结
  4. java easyui tree例子_EasyUI Tree的简单使用
  5. 使用Python和OpenCV捕获鼠标事件,并裁剪图像
  6. 神经网络基础:(1)得分函数 or 得分函数
  7. 力扣(LeetCode)刷题,简单题(第11期)
  8. keras 的 example 文件 variational_autoencoder.py 解析
  9. 洛谷 P2219修筑绿化带 二维单调队列~
  10. 数据结构与算法(8-1)顺序表查找及优化