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 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
随机推荐
- SpringBoot整合Quartz及log4j实例
SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...
- spring自带的MD5加密工具类
Spring 自带的md5加密工具类,本来打算自己找一个工具类的,后来想起来Spring有自带的,就翻了翻 //导入包import org.springframework.util.DigestUti ...
- Oracle12C安装配置文档
Oracle12C安装配置文档 Oracle12C安装配置文档 准备软件: 开始安装: 打开从官网下载下来的两个压缩包,进行解压 打开解压好的后缀为2of2的文件夹找到路径为database下的“ ...
- Dos简易基础及常用Dos命令
Dos简易基础及常用Dos命令 什么是cmd? cmd是command的缩写,意指操作系统中的命令行程序,一般说的都是Windows中的Dos系统. 如何打开cmd? 键盘操作:Win + R 输入c ...
- C011:分数相加
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int up1,down1,up2,down2; do ...
- Nginx之rewrite使用
rewrite regex replacement [flag]; flag=[break/last/redirect/permanent] ² regex 是正则表达式 ² replacement ...
- 在Linux命令行里与其他用户通信
大家好,我是良许 在 Linux 命令行里向其他用户发送信息很简单,很多命令都可以做到这点,麻烦的是你需要从众多命令中挑选一个合适的命令来使用.因此,我挑选了四种常用的 Linux 用户通信命令分享给 ...
- 用C、python手写redis客户端,兼容redis集群 (-MOVED和-ASK),快速搭建redis集群
想没想过,自己写一个redis客户端,是不是很难呢? 其实,并不是特别难. 首先,要知道redis服务端用的通信协议,建议直接去官网看,博客啥的其实也是从官网摘抄的,或者从其他博客抄的(忽略). 协议 ...
- oracle之三手工备份与恢复
手工备份与恢复 2.1 手工备份和恢复的命令 1)备份和还原都使用OS命令,如linux中的cp 2)恢复用sqlplus命令:recover 2.2 备份前要对数据库进行检查: 1) 检查需要备份的 ...
- [LeetCode]Mysql小本本
常用方法 累加型题目,可以考虑使用笛卡尔积进行自表连接,连接后的表进行where条件进行筛选.group by分组操作. union:需要把两列作一列可以用union,union的两张表查询的字段不一 ...