不带头结点的节点因为插入删除的时候会改变或者删除第一个节点,所以要引入二级指针进行一系列的操作


头文件

#pragma once
//不带头结点的单链表
typedef struct Node
{int data;//数据Node * next;//存放下一个元素的地址
}Node;
//初始化
void InitList(Node **ps);
//头插
bool Insert_Head(Node **ps,int val);
//尾插
bool Insert_Tail(Node **ps,int val);
//按位置插入
bool Insert_Pos(Node **ps,int pos,int val);
//删除某个节点
bool Delete_Node(Node **ps,int key);
//删除整个链表
bool Delete_List(Node **ps);
//查找
Node *Search(Node *ps,int key);
//链表长度
int GetLength(Node *ps);
//打印链表的值
void Show(Node* ps);

cpp文件

#include<iostream>
#include<assert.h>
#include"NoList.h"
using namespace std;void InitList(Node* *ps)
{assert(ps != NULL);*ps = NULL;
}static Node* BuyNode(int val)
{Node *pnewnode = new Node();pnewnode->data = val;pnewnode->next = NULL;return pnewnode;
}
bool Insert_Head(Node* *ps,int val)
{assert(ps != NULL);Node* pnewnode = BuyNode(val);pnewnode->next = *ps;*ps = pnewnode;return true;
}bool Insert_Tail(Node* *ps,int val)
{assert(ps != NULL);Node* pnewnode = BuyNode(val);Node* pTail = *ps;if(pTail == NULL){*ps = pnewnode;//}else{ while(pTail->next != NULL){pTail = pTail->next;}pTail->next = pnewnode;}return true;
}bool Insert_Pos(Node* *ps,int pos,int val)
{assert(ps != NULL);Node * q = *ps;for(int i = 0;i<pos;i++){q = q->next;}Node *p =BuyNode(val);p->next = q->next;q->next = p;return true;
}bool Delete_Node(Node* *ps,int key)
{assert(ps != NULL);Node* p = Search(*ps,key);if(p == NULL){return false;}//删除的节点是第一个节点也是最后一个节点if(p == *ps){delete p;p = NULL;/ps = NULL;/}//删除的节点不是尾结点else if(p->next != NULL){Node * q = p->next;p->data = q->data;p->next = q->next;delete q;q = NULL;}//节点有很多,删除的节点是尾结点else if(p ->next == NULL){Node* q = *ps;for(;q->next!= NULL;q = q->next);/*q ->next = NULL;q->next ->data = NULL;delete (q->next);*/q ->next = NULL;delete (q->next);p = NULL;}return true;
}bool Delete_List(Node* *ps)
{assert(ps != NULL);Node* p;//Node* q = p;while(*ps != NULL){p = *ps;*ps = p->next;delete p;}return true;
}Node* Search(Node* ps,int key)
{assert(ps != NULL);Node * q  = ps;while(q != NULL){if(key == q->data){return q;}q = q->next;}return NULL;
}int GetLength(Node *ps)
{assert(ps != NULL);int length = 0;for(Node* q = ps;q!= NULL;q = q->next){length++;}return length;
}void Show(Node* ps)
{for(Node *q = ps;q!= NULL;q= q->next){cout << q->data << " " ;}cout <<endl;
}

主函数

#include<iostream>
#include<assert.h>
#include"NoList.h"
using namespace std;int main()
{Node* head;InitList(&head);/*for(int i = 0;i<10;i++){Insert_Head(&head,i);}*/for(int i = 0;i<10;i++){Insert_Tail(&head,i,i);}Show(*&head);cout << GetLength(head) << endl;Insert_Pos(&head,5,111);Show(*&head);cout << GetLength(head) << endl;Delete_Node(&head,5);Show(head);cout << GetLength(head) << endl;Delete_List(&head);Show(head);return 0;
}

单链表(不带头结点)相关推荐

  1. C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

    http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...

  2. 单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

    编程语言:c语言 编译环境:Dev-c++ 实现功能:实现功能:单链表(带头结点)结点结构体的定义,单链表(带头结点)初始化.求元素个数.插入元素.删除元素.取元素.打印所有元素.就地逆置.撤销的操作 ...

  3. 头插法建立单链表(带头结点和不带头结点)

    头插法建立单链表(带头结点) #include <stdio.h> #include <stdlib.h> typedef struct LNode{        //定义单 ...

  4. 小白算法积累——单链表6#带头结点单链表+递增有序

    题目:有一个带头结点的单链表L,设计一个算法使其元素递增有序. 关键字:带头结点单链表+递增有序 思路 采用直接插入排序算法的思想:就是先分理出头结点+第一个结点组成原始新链表,然后依次将后续结点摘下 ...

  5. 单链表:带头结点和不带头结点 总结

    写在前面: 一直以来,带头结点和不带头节点的单链表的操作实现困扰着我.在没有理解和实现之前,光凭思考真的是很难理解清楚 1.两者之间代码的差异: 2.带不带头结点的区别: 3.带头结点之后,什么情况下 ...

  6. C++ 单链表(带头结点)

    文章目录 总结归纳 代码实现 总结归纳 头结点可以没有,头指针必须有.访问整个链表,是用过遍历头指针来进行的. 这里没有特别的设置一个头指针,因为当指针指向整个链表 L 时,该指针的实现效果就是头指针 ...

  7. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  8. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  9. 在单链表(带头结点)中的第i个位置前面插入一个新结点的初始化问题

    方法: 想要在链表第i个元素前面插入新结点,则需要将指针指向第i-1个元素,从而将其next域中保存的第i个元素地址赋值给新结点,实现链接. void InserttoList(LinkList he ...

  10. 小白算法积累——单链表13#带头结点单链表+就地归并+改序

    题目:假设有两个按元素值递增次序排列的线性表,均以单链表的形式存储.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表. 关键字:带头结点 ...

最新文章

  1. matlab中文文档_Linux下Matlab安装
  2. mysql5.5在windows7下编译的详细步骤_Windows7下编译MySQL5.5的详细步骤
  3. rtmp推流h264+aac
  4. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
  5. 【Flink】Flink Distributed Cache 分布式缓存
  6. QtDesigner如何添加工具栏toolBar
  7. 21天jmeter打卡day6 配置元件之HTTP信息头+Cookie管理器
  8. arduino upload程序时 出现can't open device /dev/ttyUSB0
  9. Oracle11g exp 1445,oracle11g 导出表报EXP-00011:table不存在。
  10. java转换json格式_java中常见的JSON格式转换方法:
  11. matlab数组、矩阵运算
  12. WinHttp c++ 介绍及应用
  13. qt中xxx.pro:64: error: Extra characters after test expression.
  14. OPTEE学习笔记 - IPC
  15. 计算机无法识别游戏手柄,windows10系统下游戏手柄无法识别或工作怎么解决
  16. 一个P9告诉你为什么某电商怕了拼多多
  17. Are you trying to connect to a TLS-enabled daemon without TLS?
  18. 《Linux命令行与shell脚本大全》笔记
  19. 从0开始编写一个应用(android端+小程序端+服务器端)第二步 项目经理完成逻辑图。(下:产品细节思考后的实现逻辑图)
  20. 微信企业号 苹果ios 返回页面不刷新 h5

热门文章

  1. 开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?
  2. 云栖专辑 | 阿里开发者们的第12个感悟:多维思考,胜过盲目苦干
  3. 谈谈社区、产品和新Dubbo | 从Dubbo 的社区star 数突破 2 万说起
  4. 云计算架构设计6大原则,你遵循了吗?| 赠书
  5. 雪花算法(snowflake) :分布式环境,生成全局唯一的订单号 | CSDN 博文精选
  6. 动动手指头, Feed 流系统亿级规模不用愁
  7. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  8. Spark精华问答 | RDD的核心概念是什么?
  9. 成为最大的独立开源公司,对SUSE意味着什么? | 人物志
  10. 防saq注入_去中心化交易所CYBEX将为区块链ICO注入新的价值观