单链表的初始化、增删查改、遍历一次找中间结点、删除一个无头单链表的非尾结点(不给头结点)

#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++实现相关推荐

  1. 数据结构之单链表的增删查改等操作画图详解

    单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...

  2. c语言 单链表的增删查改

    文章目录 1.链表基本结构 2.链表的尾插 3.链表的尾删 4.链表的头插与头删 头插 头删 5.链表的查找与修改 查找 修改 6.链表的节点插入与删除 插入 删除 1.链表基本结构 链表由一个个的节 ...

  3. 【数据结构】单链表的增删查改(C语言实现)

    文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...

  4. c语言 增删查 案例,C语言实现单链表的增删查改

    #include #include #include"linklist.h" #define Test_Header printf("\n-----%s-----\n&q ...

  5. Java——链表的增删查改

    [基础学习] 链表的增删查改 注意:所有链表都先需要判断是否为null <1>链表的增 有三种方法,分别为:头插法,尾插法,任意节点位置插法 1.头插法 2.尾插法 3.任意节点位置插法 ...

  6. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

  7. C语言 数据结构 链表的增删查改

    分别用函数实现了链表的: 1.增加(头插法,尾插法,有序插入) 2.删除 3.修改 4.查找 C代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio ...

  8. 【JAVA数据结构】链表的增删查改(单向不带头非循环链表)

    月色与雪色之间,你是第三种绝色 大家好,这里是新一,请多关照

  9. 数据结构-带头双向循环链表(增删查改详解)

    在上一篇博客中,详细介绍了单链表的增删查改,虽然单链表的结构简单,但是用起来却不是那么顺手.因此根据单链表的种种缺点,这篇博客所介绍的带头双向循环链表将会带来极大的优化. 上图就是带头双向循环链表的主 ...

最新文章

  1. java param add_Java中的Map paramMap
  2. Oracle有使用某个索引吗?(如何监控)
  3. linux connect 阻塞超时时间,在linux下玩转带有超时时间的connect函数
  4. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
  5. 【ThinkingInC++】66、pointer Stash的使用
  6. Eclipse build Android时不生成apk问题解决方法
  7. varnish 4.0 官方文档翻译17-Hashing
  8. OpenGL常见函数功能查询
  9. Android学习笔记一:Android基本组件和Activity生命周期
  10. ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN
  11. 工具网站:10个国外免费、无版权、高清图片素材站
  12. rpm的mysql怎么安装_MySQL的rpm安装教程
  13. 手机QQ邮箱可以发html邮件么,如何使用手机qq邮箱发送邮件
  14. mysql my.cnf 生效_mysql配置文件生效顺序
  15. Illegal group reference:非法组引用异常
  16. java利用poi导出word文档
  17. “单向网闸”技术介绍-网络隔离的新型产品
  18. HDR视频色调映射算法(之三:Block matching TMO)
  19. 商务通怎么做html留言板,网站商务通对话框设置技巧
  20. 基于组态王的过程控制——以巧克力牛奶的生产为例

热门文章

  1. weblogic12 linux部署,linux系统中安装部署weblogic12.1.3
  2. LeetCode-反转链表
  3. Codeforces 1028C(面积并/思维)
  4. .Net Core和Jexus配置HTTPS服务
  5. javascript谜题
  6. 改变背景色为苹果绿--保护眼睛
  7. 转载:介绍AD另外一种奇葩的多通道复用的方法
  8. 吴恩达《机器学习》课程总结(19)总结
  9. 如何正确的终止正在运行的子线程
  10. Vr-Vantage之场景与环境