一、创建linklist.h头文件,创建LNode结点,LinkList链表类

#pragma once //防止头文件重复包含
#include<iostream> //标准输入输出流
using namespace std; //标志命名空间//创建结点
struct LNode
{int Data; //数据域LNode* Next; //指针域
};//创建单链表类
class LinkList
{
public://利用构造函数初始化单链表LinkList();//显示菜单void MenuList();//创建单链表L并使用头插法,插入n个元素void CreateList_H();//创建单链表L并使用尾插法,插入n个元素void CreateList_R();//在单链表L中第i个元素之前插入数据元素evoid ListInsert();//将单链表L中第i个数据元素删除void ListDelete();//遍历单链表Lvoid PrintList();//求单链表的表长void ListLength();//判断单链表是否为空void ListEmpty();//获取单链表中的某个元素的内容,通过变量e返回void GetElem();//在单链表L中查找值为e的数据元素的位置序号void LocateElem();//清空单链表void ClesrList();//销毁单链表,并退出void DestroyList();public:LNode * L; //头指针,单链表名
};

二、创建linklist.cpp源文件,实现链表类中函数功能的具体实现

#include"linklist.h"//利用构造函数初始化单链表
LinkList::LinkList()
{L = new LNode; //头指针指向头结点L->Next = NULL;L->Data = 0;
}//显示菜单
void LinkList::MenuList()
{cout << "---------1、头插法创建链表---------------------" << endl;cout << "---------2、尾插法创建链表---------------------" << endl;cout << "---------3、在链表中任意位置插入元素-----------" << endl;cout << "---------4、在链表中任意位置删除元素-----------" << endl;cout << "---------5、遍历单链表-------------------------" << endl;cout << "---------6、返回单链表表长---------------------" << endl;cout << "---------7、判断单链表是否为空-----------------" << endl;cout << "---------8、按位查找返回值---------------------" << endl;cout << "---------9、按值查找返回序号-------------------" << endl;cout << "---------10、清空单链表------------------------" << endl;cout << "---------0、销毁单链表并退出------------------" << endl;
}//创建单链表L并使用头插法,插入n个元素
void LinkList::CreateList_H()
{L = new LNode; //创建头结点L->Next = NULL; //将头结点指针域置空LNode* p; //创建指针变量pint n; //记录插入个数cout << "请输入你要插入的元素个数:" << endl;cin >> n;for (int i = 1; i <= n; i++){p = new LNode; //生产新结点cout << "请输入第" << i << "个元素:" << endl;cin >> p->Data; //输入元素值p->Next = L->Next; //将头结点的指针域赋值给新结点的指针域L->Next = p; //头结点的指针域记录新结点的地址}cout << "插入完毕,按任意键继续" << endl;system("pause");system("cls");
}//创建单链表L并使用尾插法,插入n个元素
void LinkList::CreateList_R()
{L = new LNode; //创建头结点L->Next = NULL; //将头结点指针域置空LNode* r,*p; //创建尾指针r 新结点pr = L; //将头指针赋值给尾指针,使尾指针也指向头结点int n; //记录插入个数cout << "请输入你要插入的元素个数:" << endl;cin >> n;for (int i = 1; i <= n; i++){p = new LNode; //生产新结点cout << "请输入第" << i << "个元素:" << endl;cin >> p->Data; //输入元素值p->Next = NULL; //将新结点指针域置为空r->Next = p; //尾指针指针域指向新结点r = p; //r指向新的尾结点}cout << "插入完毕,按任意键继续" << endl;system("pause");system("cls");
}//在单链表L中第i个元素之前插入数据元素e
void LinkList::ListInsert()
{LNode* p,*s; //创建指针变量p,sp = L; //p指向头结点是因为可以在头结点之后插入,所以要从头结点开始出发int i,e,j=0; //i记录插入位置,e记录插入元素,j记录序号cout << "请输入要插入的位置:" << endl;cin >> i;while (p&&j<i-1) //p为空或找到i前一个元素,则停止循环{p = p->Next;j++;}if (!p || j > i - 1) //!p为真则i大于表长+ 1,j >i-1为真则表示i小于1{cout << "输入的位置不合法" << endl;}else{s = new LNode; //创建新结点cout << "请输入要插入的数据:" << endl;cin >> e;s->Data = e; //将e赋给s结点的数据域s->Next = p->Next; //将p指针域中记录的下一结点地址赋给s结点的指针域p->Next = s; //p结点指针域中记录结点s地址cout << "插入成功,请按任意键继续" << endl;}system("pause");system("cls");
}//将单链表L中第i个数据元素删除
void LinkList::ListDelete()
{LNode* p, * q; //创建指针变量p,qp = L;int i,e,select, j = 0; //i记录选择想要删除位置,e保存删除位置数据域,select选择是否删除cout << "请输入要删除的位置:" << endl;cin >> i;while (p->Next && j <i-1) //p->为空或找到i前一个元素,则停止循环{p = p->Next;j++;}if (!(p->Next) || j > i - 1)//!p->Next为真则输入的i大于表长+ 1,j >i-1为真则表示i小于1{cout << "输入的" << i << "不合法或不存在" << endl;}else{q = p->Next; //q结点记录要删除的结点p->Next = q->Next; //p结点的指针域指向要删除结点的下一结点指针域e = q->Data; //保存要删除结点的数据域cout << "第" << i << "个位置中的元素为:" << e << " 请确认是否删除" <<endl;cout << "1、是" << endl;cout << "2、否" << endl;cin >> select;if (select == 1) //确认是否删除{delete q;cout << "删除成功" << endl;}}system("pause");system("cls");
}//遍历单链表L
void LinkList::PrintList()
{LNode* p; //创建临时变量pp = L->Next; //p指向第一个结点while (p){cout << p->Data << " ";p = p->Next;}cout << endl;system("pause");system("cls");
}//求单链表的表长
void LinkList::ListLength()
{LNode* p; //创建临时变量pp = L->Next; //p指向第一个结点int count = 0; //统计表长while (p) //判断p是否指向空,为空结束循环{count++; p = p->Next; //p指向下一结点的指针域} cout << "单链表的表长为:" << count << endl;system("pause");system("cls");
}//判断单链表是否为空
void LinkList::ListEmpty()
{if (L->Next == NULL) //判断头结点指针域释放为空{cout << "单链表L为空" << endl;}else{cout << "单链表L不为空" << endl;}system("pause");system("cls");
}//获取单链表中的某个元素的内容,通过变量e返回
void LinkList::GetElem()
{LNode* p; //创建临时变量pp = L->Next;  //p变量存放头结点的指针域int i, e, j = 1; //变量i记录要查找的位置,e 记录查找到的数据,j记录序号cout << "请输入你要查找的位置:" << endl;cin >> i;while (p && j < i) //判断当p为空或j = i是为假,则停止循环{p = p->Next;++j;}if (!p || j > i) //当p为空或j>i时元素不存在{cout << "第" << i << "个元素不存在" << endl;}else{e = p->Data; //将查找到值赋给ecout << "第" << i << "个位置元素为:" << e << endl;}system("pause");system("cls");
}//在线性表L中查找值为e的数据元素的位置序号
void LinkList::LocateElem()
{LNode* p; //创建临时变量pp = L->Next;  //p变量存放头结点的指针域int e,j = 1; //变量e记录要查找的元素,变量j记录序号cout << "请输入你要查找的元素:" << endl;cin >> e;while (p&&p->Data != e) //判断当p为空或p->data中的数据=e时为假,则停止循环{p = p->Next;j++;}if (p) //判断p是否为空,不为空则找到元素序号{cout << "元素" << e << "位置的序号为:" << j << endl;}else{cout << "未找到" << endl;}system("pause");system("cls");
}//清空单链表
void LinkList::ClesrList()
{LNode* p, * q; //创建临时变量p,pp = L->Next; //p变量存放头结点的指针域while (p){q = p->Next; //q变量存放p的下一指针域delete p; //释放pp = q; //将q变量中的内容返还给p}L->Next = NULL; //将头结点的指针域置为空cout << "清空成功" << endl;system("pause");system("cls");
}//销毁单链表并退出
void LinkList::DestroyList()
{LNode* p; //创建临时变量pwhile (L) //循环执行直到L为空退出循环{p = L; //将头指针L的值付给pL = L->Next; //让头指针指向下一节点的指针域delete p; //销毁p}cout << "销毁成功,欢迎下次使用" << endl;system("pause");exit(0);
}

三、在主函数中包含linklist.h头文件,并利用while、switch等循环实现功能调用。

#include<iostream>
using namespace std;
#include"linklist.h" //链表类头文件int main()
{LinkList L;int select = 0;while (true){L.MenuList();cout << "请输入你的选择:" << endl;cin >> select;switch (select){case 1: //头插法创建链表L.CreateList_H();break;case 2: //尾插法创建链表L.CreateList_R();break;case 3: //在链表中任意位置插入元素L.ListInsert();break;case 4: //在链表中任意位置删除元素L.ListDelete();break;case 5://遍历单链表L.PrintList();break;case 6://返回单链表表长L.ListLength();break;case 7://判断单链表是否为空L.ListEmpty();break;case 8://按位查找返回值L.GetElem();break;case 9://按值查找返回序号L.LocateElem();break;case 10://清空单链表L.ClesrList();break;case 0://销毁单链表并退出L.DestroyList();break;default:cout << "输入有误请重新输入" << endl;system("pause");system("cls");break;}}system("pause");return 0;
}

四、功能展示

利用C++创建带头结点单链表,并实现插入、删除、遍历、清空、退出等功能相关推荐

  1. 创建带头结点单链表实现二进制数加1的运算

    题目描述: 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.在此链表上实现对二进制数加1的运算,并输出运算结果. 测试数据1: 1010011 测试数据 ...

  2. 带头结点单链表就地逆置算法

    1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...

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

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

  4. 在带头结点单链表中查找最大值,将其与最后一个元素交换(交换值)

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

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

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

  6. 算法与数据结构之带头结点和不带头结点单链表存在的问题

    带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...

  7. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

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

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

  9. 带头结点单链表的基本使用

    1.功能说明: 1.带头结点单链表的创建      2.单链表头插      3.单链表尾插      4.单链表第i个位置插入      5.单链表输出      6.单链表删除第i个位置结点   ...

最新文章

  1. JavaFX项目jar使用javafxpackager生成exe
  2. Halcon中MIN宏定义与自己定义的C++中MIN函数--重命名冲突问题解决方法
  3. 100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen
  4. “最佳融合通信创新应用平台”认证!2021 年度全球新经济卓越成就奖揭晓
  5. Python之——遇到的小知识点总结
  6. 配置View桌面时找不到域的解决方法
  7. 在Visual Studio上开发Node.js程序
  8. 零基础自学java_零基础学Java——小白的Java之路(4)
  9. 11个让你吃惊的 Linux 终端命令
  10. matlab销量预测的数学模型,数学建模:酒店最优化问题.用matlab算出《酒店价格预测模型》...
  11. 《软件测试方法与技术实践指南》Java EE篇 文摘
  12. 对话 “智能+”平台大师,看IBM如何重塑企业数字化
  13. 犀牛Rhino教程合集37部
  14. 基于AT89S52的俄罗斯方块游戏设计与实现
  15. html 小喇叭图标,小喇叭不见了怎么办(小喇叭图标不见了的原因及解决办法)...
  16. MySQL之查询关键字
  17. 2021 年职业院校技能大赛“网络安全”项目 江西省比赛任务书
  18. 常用Linux命令,记录一下,避免搞忘记!
  19. 【强化学习】用强化学习通关超级马里奥!
  20. 编写Outlook html邮件

热门文章

  1. H2数据库使用与管理入门
  2. 新浪微博爬虫遇到的cookie rejected 问题解决办法
  3. sona: Spark on Angel部署教程
  4. BC 字节串转 ASN1Integer
  5. linux的scp命令用不了,CentOS使用不了scp命令怎么办
  6. Visual Studio编译Lua库
  7. ZEMAX光学设计——激光准直镜设计
  8. Android面试题汇总(中高级)及答案解析,2023年企业面试题精选
  9. bigint如何自增_自增主键用完了该怎么办
  10. 机器学习中较为简单的算法有哪些?