单链表的增删查改等基本操作C++实现
单链表的初始化、增删查改、遍历一次找中间结点、删除一个无头单链表的非尾结点(不给头结点)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct ListNode
{struct ListNode* _next;DataType _data;
}ListNode;
void InitList(ListNode* &pHead)
{pHead=NULL;
}
ListNode* CreatNode(DataType x)
{ListNode* tmp;tmp=(ListNode*)malloc(sizeof(ListNode));tmp->_data=x;tmp->_next=NULL;return tmp;
}
void PushFront(ListNode* &pHead,DataType x)
{ListNode* NewNode;if(pHead==NULL){pHead=CreatNode(x);return;}else{NewNode=CreatNode(x);NewNode->_next=pHead;pHead=NewNode;}
}
void PushBack(ListNode* &pHead,DataType x)
{ListNode* tmp=CreatNode(x);if(pHead==NULL){pHead=tmp;return;}else{ListNode* p=pHead;while(p->_next){p=p->_next;}p->_next=tmp;}
}
void PopFront(ListNode* &pHead)
{if(pHead==NULL){printf("链表为空");return;}else{pHead=pHead->_next;}
}
void PopBack(ListNode* &pHead)
{if(pHead==NULL){printf("链表为空\n");system("pause");exit(0);}else if(pHead->_next==NULL){pHead=NULL;}else{ListNode* tmp=pHead;while(tmp->_next->_next){tmp=tmp->_next;}tmp->_next=NULL;}
}
ListNode* Find(ListNode* pHead,DataType x)
{if(pHead==NULL){printf("链表为空\n");system("pause");exit(0);}else{ListNode* tmp=pHead;while((tmp->_data!=x)&&(tmp->_next!=NULL)){tmp=tmp->_next;}if(tmp->_data==x){return tmp;}else{printf("想找的数据不存在\n");system("pause");exit(0);}}
}
void Insert(ListNode* pos,DataType x)
{ListNode* NewNode=CreatNode(x);NewNode->_next=pos->_next;pos->_next=NewNode;
}
void Erase(ListNode* &pHead,ListNode* pos)
{while(pHead->_next!=pos){pHead=pHead->_next;}pHead->_next=pos->_next;
}
//遍历一次找中间结点
ListNode* Cheak_MidNode(ListNode* pHead)
{ListNode* p1=pHead;ListNode* p2=pHead;int count=0;while(p1->_next){p1=p1->_next;count++;if(count%2==0){p2=p2->_next;}}return p2;
}
//删除一个无头单链表的非尾节点(不给头节点)
void Delete_NoHeadNode(ListNode* pos)
{pos->_data=pos->_next->_data;pos->_next=pos->_next->_next;
}
void Print(ListNode* pHead)
{while(pHead){printf("%d->",pHead->_data);pHead=pHead->_next;}printf("NULL\n");
}
void Print_Node(ListNode* pHead,ListNode* pos)
{while(pHead!=pos){pHead=pHead->_next;}printf("中间结点为:%d\n",pos->_data);
}
void Test1()
{ListNode* pHead;InitList(pHead);/*PushFront(pHead,1);PushFront(pHead,2);PushFront(pHead,3);*/PushBack(pHead,1);PushBack(pHead,2);PushBack(pHead,3);/*PopFront(pHead);PopFront(pHead);PopFront(pHead);PopFront(pHead);*//*PopBack(pHead);PopBack(pHead);PopBack(pHead);PopBack(pHead);*/Print(pHead);
}
void Test2()
{ListNode* pHead;InitList(pHead);PushBack(pHead,1);PushBack(pHead,2);PushBack(pHead,3);ListNode* pos=Find(pHead,2);//ListNode* pos=Find(pHead,5);Insert(pos,7);Print(pHead);Erase(pHead,pos);Print(pHead);
}
void Test3()
{ListNode* pHead;InitList(pHead);PushBack(pHead,1);PushBack(pHead,2);PushBack(pHead,3);PushBack(pHead,4);PushBack(pHead,5);ListNode* pos=Cheak_MidNode(pHead);Print(pHead);Print_Node(pHead,pos);
}
void Test4()
{ListNode* pHead;InitList(pHead);PushBack(pHead,1);PushBack(pHead,2);PushBack(pHead,3);PushBack(pHead,4);Print(pHead);ListNode* pos=Find(pHead,3);Delete_NoHeadNode(pos);Print(pHead);
}
int main()
{//Test1();//Test2();//Test3();Test4();system("pause");return 0;
}
转载于:https://blog.51cto.com/10707460/1754730
单链表的增删查改等基本操作C++实现相关推荐
- 数据结构之单链表的增删查改等操作画图详解
单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...
- c语言 单链表的增删查改
文章目录 1.链表基本结构 2.链表的尾插 3.链表的尾删 4.链表的头插与头删 头插 头删 5.链表的查找与修改 查找 修改 6.链表的节点插入与删除 插入 删除 1.链表基本结构 链表由一个个的节 ...
- 【数据结构】单链表的增删查改(C语言实现)
文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...
- c语言 增删查 案例,C语言实现单链表的增删查改
#include #include #include"linklist.h" #define Test_Header printf("\n-----%s-----\n&q ...
- Java——链表的增删查改
[基础学习] 链表的增删查改 注意:所有链表都先需要判断是否为null <1>链表的增 有三种方法,分别为:头插法,尾插法,任意节点位置插法 1.头插法 2.尾插法 3.任意节点位置插法 ...
- 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增 删 插 查 改. #include #include #include #i ...
- C语言 数据结构 链表的增删查改
分别用函数实现了链表的: 1.增加(头插法,尾插法,有序插入) 2.删除 3.修改 4.查找 C代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio ...
- 【JAVA数据结构】链表的增删查改(单向不带头非循环链表)
月色与雪色之间,你是第三种绝色 大家好,这里是新一,请多关照
- 数据结构-带头双向循环链表(增删查改详解)
在上一篇博客中,详细介绍了单链表的增删查改,虽然单链表的结构简单,但是用起来却不是那么顺手.因此根据单链表的种种缺点,这篇博客所介绍的带头双向循环链表将会带来极大的优化. 上图就是带头双向循环链表的主 ...
最新文章
- java param add_Java中的Map paramMap
- Oracle有使用某个索引吗?(如何监控)
- linux connect 阻塞超时时间,在linux下玩转带有超时时间的connect函数
- android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
- 【ThinkingInC++】66、pointer Stash的使用
- Eclipse build Android时不生成apk问题解决方法
- varnish 4.0 官方文档翻译17-Hashing
- OpenGL常见函数功能查询
- Android学习笔记一:Android基本组件和Activity生命周期
- ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN
- 工具网站:10个国外免费、无版权、高清图片素材站
- rpm的mysql怎么安装_MySQL的rpm安装教程
- 手机QQ邮箱可以发html邮件么,如何使用手机qq邮箱发送邮件
- mysql my.cnf 生效_mysql配置文件生效顺序
- Illegal group reference:非法组引用异常
- java利用poi导出word文档
- “单向网闸”技术介绍-网络隔离的新型产品
- HDR视频色调映射算法(之三:Block matching TMO)
- 商务通怎么做html留言板,网站商务通对话框设置技巧
- 基于组态王的过程控制——以巧克力牛奶的生产为例