如下是一个模拟的链表的基本操作,主要有创建链表,连接链表,打印链表,删除链表等,后面有关链表的算法都依赖这个文件中函数实现。

ListCommon.h

//链表的结构

struct ListNode{
    int m_nValue;
    ListNode* m_pNext;
};

//通用的操作函数

ListNode* CreateListNode(int value);
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);
void PrintListNode(ListNode* pNode);
void PrintList(ListNode* pHead);
void DestoryList(ListNode* pHead);
//其中的参数是指向指针的指针,
void AddToTail(ListNode** pHead, int value);
void RemoveNode(ListNode** pHead, int value);

ListCommon.cpp

#include <iostream>
#include <stdlib.h>
#include "ListCommon.h"
using namespace std;

//链表的结构
//struct ListNode{
//    int m_nValue;
//    ListNode* m_pNext;
//};

//通用的操作函数

//创建链表节点
ListNode* CreateListNode(int value){
    ListNode* pNode = new ListNode();
    pNode->m_nValue = value;
    pNode->m_pNext = NULL;
}

//连接两个链表节点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext){
    if(pCurrent == NULL){
        cout << "can not to connect two nodes ! " <<endl;
        exit(1);
    }

pCurrent->m_pNext = pNext;
}

//打印一个链表节点
void PrintListNode(ListNode* pNode){
    if(pNode == NULL){
        cout << "The node is NULL !" <<endl;
    }else{
        cout << "The value of node is " << pNode->m_nValue <<endl;
    }
}

//打印整个链表,不要用pHead节点直接操作,否则操作结束这个链表就无法获取了。
void PrintList(ListNode* pHead){
    cout << "print list begin ---" <<endl;
    ListNode * pNode = pHead;
    while(pNode != NULL){
        cout << pNode->m_nValue<< endl;
        pNode = pNode->m_pNext;

if(pNode == pHead){
            break;
        }

}
    cout << "print list end " <<endl;
}

//销毁链表
void DestoryList(ListNode* pHead){
    ListNode* pNode = pHead;

while(pNode != NULL){
        pHead = pHead->m_pNext;
        delete pNode;
        pNode = pHead;
    }
}

//从尾部添加节点,其中的参数是指向指针的指针,因为这里的pHead值是可能会变化的。
void AddToTail(ListNode** pHead, int value){
    ListNode* pNew = new ListNode();
    pNew->m_nValue = value;
    pNew->m_pNext = NULL;
//空链表,这时头指针就被改变了,确切说是头指针指向的内容被改变了,也即是说这里需要指针指向的内容,所以用了指向指针的指针。
    if(*pHead == NULL){
        *pHead = pNew;
    }else{
        ListNode* pNode = *pHead;
        while(pNode != NULL){
            pNode = pNode->m_pNext;
        }    
        pNode->m_pNext = pNew;
    }
}

//删除节点
void RemoveNode(ListNode** pHead, int value){
    if(pHead == NULL || *pHead == NULL){
        return;
    }
    
    ListNode* pToBeDeleted = NULL;
    if((*pHead)->m_nValue == value){
        pToBeDeleted = *pHead;
        *pHead = (*pHead)->m_pNext;
    }else{
        ListNode* pNode = *pHead;
        while(pNode->m_pNext !=NULL && pNode->m_pNext->m_nValue !=value){
            pNode = pNode->m_pNext;
        }
        if(pNode->m_pNext !=NULL && pNode->m_pNext->m_nValue == value){
            pToBeDeleted = pNode->m_pNext;
            pNode->m_pNext = pNode->m_pNext->m_pNext;
        }
    }
    if(pToBeDeleted != NULL){
        delete pToBeDeleted;
        pToBeDeleted = NULL;
    }
}

链表基本操作的函数实现。(1)相关推荐

  1. 数据结构 【实验3 链表基本操作】

    实验3  链表基本操作 实验目的 1.  定义单链表的结点类型. 2.  熟悉对单链表的一些基本操作和具体的函数定义. 3.  通过单链表的定义掌握线性表的链式存储结构的特点. 4.  掌握循环链表和 ...

  2. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  3. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

  4. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  5. 数据结构之链表基本操作

    数据结构:单链表基本操作 单链表学习:参考数据结构:单链表基本操作 涉及到单链表的基本操作有如下: int initList(linkList *); //初始化一个单链表,具有头指针,头结点,头结点 ...

  6. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  7. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

  8. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  9. 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )

    文章目录 一.RCU 模式下更新链表项 list_replace_rcu 函数 二.链表操作时使用 smp_wmb() 函数保证代码执行顺序 一.RCU 模式下更新链表项 list_replace_r ...

最新文章

  1. 使用Intellij IDEA 解决Java8的数据流问题
  2. 关于poll机制应用及驱动
  3. 收藏 | 在算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?...
  4. RandomAccessFile类的简单介绍,以及代码演示
  5. java 蓝桥杯算法训练 sign函数
  6. Julia : Array !, [1,2] !=[1 2]'
  7. 喜报!木兰宽松许可证通过OSI认证,成为首个中英双语国际开源许可证!
  8. android 经纬度距离计算器,经纬度距离角度计算软件|经纬度距离角度计算器(geography) v2.0免费版_星星软件园...
  9. android的事件处理和传递机制实例
  10. 工业机器人编程调试怎么学
  11. 学习计算机视觉,你必须了解的基础概念
  12. 机房常用动力环境设备远程集中监控及告警方案
  13. 网络流量大数据分析平台(2)
  14. ZZULIOJ:1123:最佳校友
  15. 策略模式——实现促销活动
  16. js视频背景切换js特效代码
  17. 看不懂NFT,了解这几幅画就好了
  18. 电脑桌面便签如何设置每月提醒便签事项?
  19. 51单片机入门教程__矩阵键盘的使用
  20. 神州泰岳确认将获飞信合约 称续签只是时间问题

热门文章

  1. Cobalt Strike之CHM、LNK、HTA钓鱼
  2. 线性回归分析实例(餐饮数据)python皮尔逊相关性
  3. event 对象兼容火狐、谷歌、ie浏览器问题
  4. keil5中找不到或没有对应的芯片怎么办?超详细!!
  5. BIUT比特信任系统公链 双周报 第65期
  6. MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)
  7. 按照RFC3984协议实现H264视频RTP打包(附源代码)
  8. jsf学习之a4j组件
  9. softmax函数的硬件实现
  10. Web报表系统葡萄城报表:报表软件