#include <stdio.h>

typedef struct _Node
{
   int value;
   _Node *next;
}Node;

void AddNodeTail(Node *&head, int value)
{
    Node *newNode = new Node;
    newNode->value = value;
    newNode->next = NULL;
    if(head == NULL)
    {
        head = newNode;
    }
    else
    {
        Node *p = head;
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = newNode;
    }
}

bool FindNode(const Node *head, int value)
{
    Node *p = const_cast<Node*>(head);
    bool found = false;
    while(p != NULL)
    {
        if(p->value == value)
        {
            found = true;
            break;
        }
        p = p->next;
    }
    return found;
}

void DeleteNode(Node *&head, int value)
{
    if(head == NULL)
    {
        return;
    }

Node *delNode = NULL;
    if(head->value == value)
    {
        delNode = head;
        head = head->next;
    }
    else
    {
        Node *pNode = head;
        while(pNode->next != NULL && pNode->next->value != value)
        {
            pNode = pNode->next;
        }
        if(pNode->next != NULL && pNode->next->value == value)
        {
            delNode = pNode->next;
            pNode->next = pNode->next->next;
        }
    }

if(delNode)
    {
        delete delNode;
    }
}

void DeleteAllNode(Node *&head, int value)
{
    while(head != NULL && head->value == value)
    {
        Node *delNode = head;
        head = head->next;
        delete delNode;
    }
    Node *pNode = head;
    while(pNode->next != NULL)
    {  
        if(pNode->next->value == value)
        {
            Node *delNode = pNode->next;
            pNode->next = pNode->next->next;
            delete delNode;
        }
        else
        {
            pNode = pNode->next;
        }
    }
}

void PrintList(Node *head)
{
    while(head != NULL)
    {
        printf("%d  ", head->value);
        head = head->next;
    }
    printf("\n");
}

void ReverseList(Node *&head)
{
    //空或者仅包含一个节点
    if(head == NULL || head->next == NULL)
    {
        return;
    }
    Node *preNode = head;
    Node *curNode = head->next;
    preNode->next = NULL;
    while(curNode != NULL)
    {
        Node *nextNode = curNode->next;
        curNode->next = preNode;
        preNode = curNode;
        curNode = nextNode;
    }
    head = preNode;
}

int main()
{
    PrintList(NULL);
    Node *head = NULL;
    AddNodeTail(head, 10);
    AddNodeTail(head, 20);
    AddNodeTail(head, 15);
    AddNodeTail(head, 40);
    AddNodeTail(head, 15);
    PrintList(head);
   
    printf("found %d in list %s\n", 20, FindNode(head, 20) ? "true" : "false");
    printf("found %d in list %s\n", 30, FindNode(head, 30) ? "true" : "false");

DeleteNode(head, 10);
    PrintList(head);
    DeleteAllNode(head, 15);
    PrintList(head);
    DeleteNode(head, 15);
    PrintList(head);

Node *nullNode = NULL;
    DeleteNode(nullNode, 0);

Node *sameHead = NULL;
    AddNodeTail(sameHead, 10);
    AddNodeTail(sameHead, 10);
    AddNodeTail(sameHead, 15);
    AddNodeTail(sameHead, 15);
    AddNodeTail(sameHead, 10);
    AddNodeTail(sameHead, 15);
    AddNodeTail(sameHead, 10);
    PrintList(sameHead);
    DeleteAllNode(sameHead, 10);
    PrintList(sameHead);

Node *oneNode = NULL;
    AddNodeTail(oneNode, 1);
    ReverseList(oneNode);
    PrintList(oneNode);

Node *twoNode = NULL;
    AddNodeTail(twoNode, 1);
    AddNodeTail(twoNode, 2);
    ReverseList(twoNode);
    PrintList(twoNode);

Node *fiveNode = NULL;
    AddNodeTail(fiveNode, 1);
    AddNodeTail(fiveNode, 2);
    AddNodeTail(fiveNode, 3);
    AddNodeTail(fiveNode, 4);
    AddNodeTail(fiveNode, 5);
    ReverseList(fiveNode);
    PrintList(fiveNode);
    return 0;
}

C++单链表操作的更多相关文章

  1. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

  2. 数据结构之 线性表---单链表操作A (删除链表中的指定元素)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...

  3. c语言实现--带头结点单链表操作

    可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...

  4. C单链表操作

    #include <stdio.h> #include <stdlib.h> #define ElemType int #define Status int #define O ...

  5. C++ 单链表操作总结

    第一.单链表的定义和操作 #include <iostream> using namespace std; template <typename T> struct Node ...

  6. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  7. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

  8. 【数据结构与算法】单链表操作(C++)

    #include <stdio.h> #include <malloc.h> /*单链表节点定义*/ typedef struct LNode { int data; //da ...

  9. 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

    数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...

随机推荐

  1. C# 获取当前月的月初和月末

    /// <summary> /// 获取当前月的月末日期 /// </summary> /// <returns></returns> public s ...

  2. UI设计中的软件知识

    最近挺想学学UI的,因为我们公司没有UI,所以做页面都是全靠摸索,老是被领导说没有审美[捂脸] 学习UI所需要的软件 PS  AI Sketch XD Sketch是MAC才能安装的软件 作者:彼岸舞 ...

  3. db2错误代码可能的原因

    一. SQL5005C运行cmd未用管理员权限打开 SQLCODE-303  数据类型不兼容 SQLCODE-305   查出的数据有NULL未处理直接写入接收变量 二.应该不会有人直接写sql用这个 ...

  4. 如何使用 TDengine 2.0 最新开源的集群功能?

    导读:8月3日,TDengine 发布了 v2.0 版本,这次更新最大的亮点是,我们将分布式集群功能开源.开源后,引起了很大反响,又连续几天在 GitHub 趋势榜排名第一.不少关注TDengine的 ...

  5. CEO的行为风格会影响公司业绩吗?

    中国的两大互联网巨头--腾讯和阿里,创始人的风格非常不同.在公众面前,马云的形象是高谈阔论,而马化腾则显得较为低调.在公司管理上,马云不插手具体事务,而是站在高处务虚,抓战略.抓文化,而马化腾则是腾讯 ...

  6. Spock测试套件入门

    目录 Spock测试套件 核心概念 整体认识 前置.后置 同junit的类比 Feature 方法 blocks 典型的用法 异常condition then和expect的区别 cleanup bl ...

  7. netty学习心得2内存池

    http://frankfan915.iteye.com/blog/2199600 https://www.jianshu.com/p/13f72e0395c8:一个性能调优的文档,还有一些linux ...

  8. python文档翻译之概述

    Python是一个使用方便且功能强大的变成语言.它具有高效的高级数据结构和面向对象编程特性.其优雅的语法.动态类型.解释型特性使得它成为大多数平台上脚本和快速应用程序开发的理想语言. Python解释 ...

  9. PowerJob 从 0 到 1.9k star 的经历

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 本文就是<讲解 PowerJob>系列的最后一篇文章了,纯粹是写点经历写点心路历程啥的,和大家道个别. ...

  10. 深入研究RocketMQ生产者发送消息的底层原理

    前言 hello,小伙伴们,王子又来和大家研究RocketMQ的原理了,之前的文章RocketMQ生产部署架构如何设计中,我们已经简单的聊过了生产者是如何发送消息给Broker的. 我们简单回顾一下这 ...