#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. 查看Linux虚拟机是什么架构

    uname -a 可以看出此虚拟机是x86架构,64位

  2. oracle之复杂查询之一:多表连接技术

    复杂查询之一:多表连接技术 7.1 简单查询的解析方法: 全表扫描:指针从第一条记录开始,依次逐行处理,直到最后一条记录结束: 横向选择+纵向投影=结果集 7.2 多表连接 交叉连接(笛卡尔积) 非等 ...

  3. mysql主从模式部署

    1.下载tar.gz格式的安装包 下载地址https://dev.mysql.com/downloads/mysql/ 2.解压 tar -zvxf mysql-5.7.19-linux-glibc2 ...

  4. 分布式文件系统之MogileFS的安装使用

    一.简介 MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发:它主要由三部分组成,第一部分是server端,server端主要包括 ...

  5. rocketmq配置文件参数(broker-xx.properties)

    #broker集群名称,用于划分broker brokerClusterName=MQCluster001 #broker名称,用于主从配对,相同名称的broker才能做主从设置 brokerName ...

  6. TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要

    在学C/C++  Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...

  7. archaius(1) 概述

    archaius作为配置管理工具,内部主要定义了下几个模块: 配置源 配置源的主要功能是将配置从目标位置加载到内存中.详见:archaius源码分析之配置源 配置管理器 配置管理器的主要功能是管理内存 ...

  8. 深入理解SVM,详解SMO算法

    今天是机器学习专题第35篇文章,我们继续SVM模型的原理,今天我们来讲解的是SMO算法. 公式回顾 在之前的文章当中我们对硬间隔以及软间隔问题都进行了分析和公式推导,我们发现软间隔和硬间隔的形式非常接 ...

  9. python爬取花木兰豆瓣影评,并进行词云分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  10. Python列出指定目录下的子目录/文件或者递归列出

    1.python只列出当前目录(或者指定目录)下的文件或者目录条目 import os files,dirs=[],[] for item in os.listdir(): if os.path.is ...