C++单链表操作
#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++单链表操作的更多相关文章
- 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏
数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- c语言实现--带头结点单链表操作
可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...
- C单链表操作
#include <stdio.h> #include <stdlib.h> #define ElemType int #define Status int #define O ...
- C++ 单链表操作总结
第一.单链表的定义和操作 #include <iostream> using namespace std; template <typename T> struct Node ...
- c语言实现--不带头结点的单链表操作
1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...
- C语言,单链表操作(增删改查)(version 0.1)
这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...
- 【数据结构与算法】单链表操作(C++)
#include <stdio.h> #include <malloc.h> /*单链表节点定义*/ typedef struct LNode { int data; //da ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
随机推荐
- ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记
Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...
- 判断Java程序是否在jar中运行
URL url = TextRenderer.class.getResource(""); String protocol = url.getProtocol(); boolean ...
- IOException的子类
ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, ...
- 区块链Fabric 交易流程
1. 提交交易预案 1)应用端首先构建交易的预案,预案的作用是调用通道中的链码来读取或者写入账本的数据.应用端使用 Fabric 的 SDK 打包交易预案,并使用用户的私钥对预案进行签名. 应用打包完 ...
- PHP复杂变量
eval($str="${${phpinfo()}}";) → 可以执行phpinfo() ${phpinfo()} = {${phpindo()}} PHP复杂变量 ...
- 把VS Code打造成Java开发IDE
近期,公司推行正版化,本人使用的是JetBrains教育版,是不允许进行商业开发的,因此开启了艰难的备用IDE选型之路.最终,我选定了轻量级的Visual Studio Code(以下简称VS Cod ...
- 基于redis的分布式锁的实现与框架解决方案
利用切面实现redis分布式锁:https://www.cnblogs.com/xiaoxiongcanguan/p/10718202.html 细节分析redis实现分布式锁的前因后果:https: ...
- linux下Crontab定时任务
1.命令格式 crontab [-u user] file crontab [-u user] [-e | -l | -r ] 2.命令参数 -u user:用来设定某个用户的crontab服务: f ...
- 单调队列优化O(N)建BST P1377 [TJOI2011]树的序
洛谷 P1377 [TJOI2011]树的序 (单调队列优化建BST 链接 题意分析 本题思路很简单,根据题意,我们利用所给的Bst生成序将Bst建立起来,然后输出该BST的先序遍历即可: 但,如果我 ...
- ViewBinding的简单使用
Android自家的,又可以省去findviewbyid(),而且Butterknife上大神都已经推荐使用的,还有什么理由不去改写呢 build.gradle 开启viewBinding功能 and ...