#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. OpenResty 作者章亦春访谈实录

    [软件简介] OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多 ...

  2. 在微信公众号"码海"里学了一招:在update语句里使用case when 以避免多次更新导致的数据异常.

    需求:将emp表中工资大于一万的降到9成,工资少于一万的乘以1.2. 难点:如果分成两句update执行,在10000附近的值可能会执行两次. 钥匙:在update语句里采用case when,使更新 ...

  3. C#的TextBox的四种禁止编辑方法

    前言 一般而言,Textbox中有两个属性可以对其进行防止编辑的设定,这是最基础的知识,也是我要提出的前两种方法.而后两种方法实际为一种,但可以应用于不同环境中. 一.ReadOnly属性 这样设置, ...

  4. 提高SSH服务安全,ssh黑白名单

    1.调整sshd服务配置,并重载服务 # vim /etc/ssh/sshd_config PermitRootLogin no                     #禁止root用户登录 Use ...

  5. shell字体颜色应用

    输出特效格式控制: \033[0m  关闭所有属性   \033[1m   设置高亮度   \03[4m   下划线   \033[5m   闪烁   \033[7m   反显   \033[8m   ...

  6. [LeetCode] 221. 最大正方形(DP)

    题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 ...

  7. c语言汇总1

    (1--10) 1.机器语言(0,1) 汇编语言(换元法) 高级语言(人) 2.C语言由函数组成而成 main函数系统会自动启动它 3.main函数格式: int main(){ call(): re ...

  8. Spring系列 之数据源的配置 数据库 数据源 连接池的区别

    Spring系列之数据源的配置 数据源,连接池,数据库三者的区别 连接池:这个应该都学习过,比如c3p0,druid等等,连接池的作用是为了提高程序的效率,因为频繁的去创建,关闭数据库连接,会对性能有 ...

  9. Powershell编程基础-004-for语句的使用

    For循环在PowerShell中也称为For语句. 同其他编程语言类似 当指定条件的值为True时,此循环以代码块的形式执行语句,另,For后面接(;;)代表恒为真! 实例1:用于执行指定次数的语句 ...

  10. linux学习(三)Linux 系统目录结构

    一.查看目录 登录系统后,在当前命令窗口下输入命令: ls / 树状目录结构: 二.目录解析 /bin: 存放二进制可执行文件(ls,cat,mkdir等). /boot: 存放启动Linux时使用的 ...