#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. 深入理解 JVM 的内存区域

    深入理解运行时数据区 代码示例: 1. JVM 向操作系统申请内存: JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终 ...

  2. 开始使用 TypeScript 和 React

    原文地址:Getting started with TypeScript and React 原文作者:Jack_Franklin 译者:luxj 校对者:veizz Tom Dale 和其他人有一些 ...

  3. docker下部署jira破解版

    1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...

  4. oracle之SQL的数据类型

    SQL的数据类型 3.1 四种基本的常用数据类型(表的字段类型) 1.字符型, 2.数值型,3.日期型,4.大对象型 3.1.1 字符型:    char         固定字符,最长2000个   ...

  5. Docker Swarm 集群环境搭建及弹性服务部署

    上一篇文章<Docker Swarm 集群管理利器核心概念扫盲>中我们把 Swarm 重要的概念性知识给大家讲解了一波,理论完事就该实战了,这篇文章带大家从零开始,搭建 Docker Sw ...

  6. 常见消息中间件之ActiveMQ

    前言 消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.目前消息队列已经逐渐成为企业IT系统内部通信的核心手段,它具有低耦合.可靠投递.广播.流量控 ...

  7. Redis学习(二)redis的特点

    一.Redis的特性 Redis是基于内存,常用作于缓存的技术 Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性. 常见的性能问题一般都是由于数据库(磁 ...

  8. dubbo学习(六)dubbo管理控制台

    管理控制台的安装与使用 下载地址:https://github.com/apache/dubbo-admin/tree/master(包含管理控制台和监控中心) PS:  下载前要选择master分支 ...

  9. centos7下安装MySQL 5.7.26 二进制版本(免安装绿色版)

    MySQL 5.7.26 二进制版本安装(免安装绿色版) 下载地址 https://downloads.mysql.com/archives/community/ https://cdn.mysql. ...

  10. Presto 标量函数注册和调用过程简述

    在Presto 函数开发一文中已经介绍过如何进行函数开发,本文主要讲述标量函数(Scalar Function)实现之后,是如何在Presto内部进行注册和被调用的.主要讲述标量函数是因为:三类函数的 ...