【数据结构】单链表基本操作(C++实现)
代码主体使用结构体+类+模板进行实现。
1.LinkList.h
//LinkList.h
#pragma once
#include<iostream>
using namespace std;
template<class T>
struct Node //结点结构
{T data; //结点数据域Node*link;//指针域Node() { link = NULL; }Node(T e, Node *next = NULL){data = e;link = next;}
};
template<class T>
class LinkList //带表头结点的单链表类
{private:Node<T> *head; //链表指针
public:LinkList(); //构造带表头结点的空单链表LinkList(T data[], int mSize);//构造有mSize个元素的单链表~LinkList() { Clear(); } //析构函数bool Insert(int pos, const T&x); //在单链表第pos个元素前插入元素xbool Remove(int pos, T&x); //删除单链表第pos个元素bool Replace(int pos, const T&x); //将修改单链表第pos个元素为xint Length()const; //求表长等不改变数据值,只是读取建议使用常函数const末尾标识bool IsEmpty() const; //判空操作void Clear(); //清空操作void Output() const; //输出链表bool search(const T&x) const;//查找元素x在表中是否存在
};
3单链表.cpp
//单链表.cpp
#include"LinkList.h"
#include<iostream>
using namespace std;
template<class T>
LinkList<T>::LinkList() {//初始化链表head = new Node<T>;head->link = NULL;
}
template<class T>
LinkList<T>::LinkList(T data[], int mSize) {//初始化链表元素head = new Node<T>;head -> link = NULL;head->data = data[0];Node < T> *end = head;for (int i = 0; i < mSize; i++){Node<T> *p = new Node<T>;p->data = data[i];p->link = NULL;end->link = p;end = p;}
}
template<class T>
bool LinkList<T>::Insert(int pos, T&x) {//插入元素int cont = 1;Node<T>*p = head;//初始指向头节点bool flag = false;//初始flag为falsewhile (p != NULL && cont <= pos - 1){if (cont == pos - 1)//如果p在目标节点处{Node<T> *add = new Node<T>;//增加节点addadd->data = x;//新增节点数据域设为xadd->link = p->link;//指针域指向原来p所指向的位置p->link = add;//p重新指向add新增节点flag = true;break;}else {//如果没到目标节点,指针一直移动并且计数器++cont++;p = p->link;}}return flag;
}
template<class T>
bool LinkList<T>::Remove(int pos, T&x)//删除元素
{int cont = 1;Node<T> *p = head;//p指向头节点bool flag = false;while (p!=NULL&&cont<=pos-1){if (cont == pos - 1){Node<T> *del = p->link;p->link=p->link->link;//删除节点(2)后p指向初始节点(1)后面(2)的后面那个元素(3)x = del->data;delete del;flag = true;break;}else{cont++;p = p->link;}}return flag;
}
template<class T>
bool LinkList<T>::Replace(int pos, T&x)//修改元素
{int cont = 1;Node<T>* p = head;bool flag = false;while (p != NULL && cont <= pos){if (cont == pos){p->data = x;flag = true;}else{cont++;p = p->link;}}return flag;
}
template<class T>
int LinkList<T>::Length()const//求表长
{int cont = 0;Node<T>*p = head;while (p != NULL){cont++;p = p->link;}return cont;
}
template<class T>
void LinkList<T>::Clear() {//清空链表if (head != NULL) {Node<T> *p;p = head->link;while(p != NULL) {Node<T> *del = p;p = p->link;delete del;}head = NULL;}
}template<class T>
bool LinkList<T>::IsEmpty()const//判空
{return head == NULL;//HEAD为空则返回true
}template<class T>
bool LinkList<T>::Search(const T&x)const//查询
{bool flag = false;Node<T>*p = head;while (p!=NULL){if (p->data == x){flag = true;break;}else{p = p->link;}}return flag;
}template<class T>
void LinkList<T>::OutPut()const//输出链表
{Node<T> *p = head;int cont = 0;while (p != NULL)\{cout << p->data << ",";p = p->link;cont++;if (cont % 10 == 0){cout << endl;}}cout << endl;
}
3.测试.cpp
//测试.cpp
#include"单链表.cpp"
#include<ctime>
void menu()//模拟菜单选项
{cout << "********************************************************" << endl;cout << "* 1 ------------输出链表 *" << endl;cout << "* 2 ------------插入元素 *" << endl;cout << "* 3 ------------删除元素 *" << endl;cout << "* 4 ------------销毁链表 *" << endl;cout << "* 5 ------------查找 *" << endl;cout << "* 0 ------------退出系统 *" << endl;cout << "********************************************************" << endl;
}
const int N = 20;
int main()
{srand((unsigned)time(NULL));//以系统当前时间初始化随机数发生器int data[N];for (int i = 0; i < N; i++)data[i] = rand() % 100;//用随机数发生器产生100以内的整数LinkList<int> L(data, N);//创建N个元素的单链表menu();while (1) //模拟菜单工作方式{int select;cout << "请输入您的选择:";cin >> select;switch (select){case 1: //输出单链表if (L.IsEmpty()){cout << "链表为空!" << endl;}elseL.OutPut();break;case 2: //插入int pos, elem;cout << "请输入插入位置:";cin >> pos;cout << "插入元素:";cin >> elem;if (L.Insert(pos, elem)) //插入成功cout << "在第" << pos << "个元素前成功插入" << elem << endl;else //插入失败cout << "插入位置不合法!" << endl;break;case 3: //删除cout << "请输入删除位置:"; cin >> pos;int x;if (L.Remove(pos, x))//删除单链表的第pos个元素cout << "单链表的第" << pos << "个元素" << x << "已被删除。" << endl;elsecout << "删除位置不合法!" << endl;break;case 4: //销毁链表char OK;cout << "确定要销毁链表吗?(y/n)" << endl;cin >> OK;if (OK == 'y' || OK == 'Y') L.Clear();break;case 5: //查找cout << "请输入查找元素:";cin >> elem;if (L.Search(elem))cout << "查找成功!" << endl;elsecout << "查找失败!" << endl;break;case 0: //退出exit(0);default:cout << "您输入的选项有误,请重新输入:";}}return 0;
}
4.运行截图
【数据结构】单链表基本操作(C++实现)相关推荐
- 数据结构-单链表基本操作-C语言代码
单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...
- 数据结构-单链表基本操作(C语言实现)
参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉) 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...
- 数据结构-单链表基本操作带图完整详解
1.什么是链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指 针链接次序实现的. 2.为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组.使 ...
- 数据结构——单链表基本操作的实现
单链表的基本操作的实现 单链表的初始化 判断链表是否为空 单链表的销毁 清空链表 求链表表长 取单链表中第i个元素的内容 根据指定值获取该值所在的位置(地址) 根据指定值获取该值所在的位置序号 插入元 ...
- 数据结构-单链表基本操作
单链表 文章目录 单链表 通常使用两个类:链表的结点类和链表类,协同表示单链表 1.链表结点类的定义 2.单链表类的定义 3.单链表输入(前插法) 4.单链表的输出 5.删去链表中除表头结点外的所有其 ...
- 【数据结构|链表】单链表基本操作
文章目录 一.链表 二.链表分类 三.单链表基本操作 3.1 单链表存储结构Init 3.2 遍历链表visitlist函数 3.3 求表长length 3.4 查找listfind ...
- 【数据结构-C】单链表基本操作及图解分析
目录 单链表介绍 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点 3. 尾插法向单链表中插入结点 4.头删法删除单链表结点 5.尾删法删除单链表结点 6.返回单链 ...
- 搬砖:数据结构之链表基本操作总结
数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...
- 数据结构之链表基本操作
数据结构:单链表基本操作 单链表学习:参考数据结构:单链表基本操作 涉及到单链表的基本操作有如下: int initList(linkList *); //初始化一个单链表,具有头指针,头结点,头结点 ...
- C 语言单链表基本操作
复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...
最新文章
- SmartImageView框架的使用
- Zynq器件的时钟系统
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象...
- 为什么Apple建议使用dispatch_once在ARC下实现单例模式?
- 虚拟机网络连接模式中桥接模式和NAT模式的区别
- html4.0打不开.swf,SecurityError Error 2148 SWF 不能访问本地资源
- 一个手机用c网可以打开网站切换到g网就打不开_推荐一些设计师常用网站!!!...
- mysql数据库双机备份_MySQL数据库双机热备份
- 排序算法,对内存小数据量大的数据排序(一)
- 激活 win10 企业版2016长期服务版本
- 哈尔滨学计算机编程学校,哈尔滨中小学生编程学校排名
- 关于团队协作开发的一些思考
- 漫谈微信开放平台一(小程序服务器url设置)
- 传中芯国际洽购华虹NEC 双方展开初步谈判
- 详情页点击其中图片转换成幻灯片图文模式,图片对应文字。
- 谷歌地球坐标_聊聊GIS中常见的地理坐标系统
- 单实例oracle ha,单实例和RAC打造的OracleStream
- 【bzoj3041】水叮当的舞步
- 统计学基于SPSS贾俊平 授课笔记 发布作业 spss19cn 软件下载地址及破解包spss19_10039 下载地址...
- 输入法中鲜为人知的自造字输入功能
热门文章
- cacti配置流量汇总
- linux环境 前端开发环境搭建,Linux运维知识之linux 前端环境搭建
- java线程异常终止_java线程莫名异常退出时,如何捕获异常信息
- java的cxf的maven_Maven+Spirng+Mybatis+CXF搭建WebService服务
- Microsoft JDBC Driver 4.0 for SQL Server
- LeetCode简单题目(#235 #237 #242 #257 #258)-5道(树、数字、字符串)
- java中有效关键字_java中有效的关键字
- 挖矿为什么要用显卡_你知道为什么挖矿用显卡,而不用CPU吗?
- Ubuntu Core for Raspberry Pi 使用笔记
- 开源GIS(二)——openlayers加载Arcgis和geoserver在线离线切片