C++学习---单链表的构建及操作
#include <iostream>
using namespace std; typedef struct LinkNode
{
int elem;//节点中的数据
struct LinkNode *next;//节点中的后继指针
}LinkNode,*LinkList;//LinkList为结构体LinkNode的指针 //构造空的单链表L
void InitList(LinkList &L) {
L = new LinkNode;//生成头节点
L->next = NULL;//头节点的后继指针初始化为NULL
} //单链表的输入(后插法)
void ListInput(LinkList &L) {
int n = 0;//输入数据的个数
LinkNode *r = L;//尾指针r指向头节点
cout << "你想要输入几个数据?" << endl;
cin >> n;
for (int i = 0; i < n; i++) {
LinkNode *node = new LinkNode;
cout << "请输入第" << i + 1 << "个数据:";
cin >> node->elem;
node->next = NULL; r->next = node;//将新节点*p插入尾节点*r
r = node;//r指向新的尾节点*p
}
}
//单链表的输出
void ListOutput(LinkList &L) {
cout << "顺序表的值依次为:";
LinkNode* p;
p = L->next;
while (p!=NULL)
{
cout << p->elem<<"\t";
p = p->next;
}
} //单链表的取值 i为取第几位值
int GetElem(LinkList &L, int i) {
LinkList p = L->next;//p指向首元节点
int countNum = 1;//计数器
while (p!=NULL&&countNum<i)
{
p = p->next;
countNum++;
}
if (p == NULL || countNum > i)//如果p为空或者计数大于i了则返回空
return NULL;
else
return p->elem;
}
//单链表的查找 e为查找的值 返回元素的内存地址
LinkNode* LocateElem(LinkList &L, int e) {
LinkNode *p = L->next;
while (p&&p->elem!=e)
{
p = p->next;
}
return p;
}
//单链表的插入 i为插入的位置 e为插入的值
bool ListInsert(LinkList& L, int i, int e) {
LinkList p = L;
int j = 0;
while (p!=NULL&&j<i-1)//将第i位的后继指针赋值给p
{
p = p->next; j++;
}
if (p == NULL||j>i-1) return false;
LinkNode *s = new LinkNode;//生成新节点
s->elem = e;//将e复制给节点s
s->next = p->next;//先将p的后继指针赋值给新节点
p->next = s;//再把p的后继指针改为新节点
return true;
}
//单链表的删除 i为删除的位置
bool ListDelete(LinkList& L, int i) {
LinkList p = L;
int j = 0;
while (p!=NULL&&j<i-1)
{
p = p->next; j++;
}
if (p == NULL || j > i - 1) return false;
LinkNode* s = new LinkNode;
s = p->next;//将第i-1位元素的内存地址赋值给s
p->next = s->next;//改变第i位元素的后继指针
delete s;//释放第i位元素的内存空间
return true;
} int main()
{
LinkList LA;
int opearateNum = 0;//操作值
//初始化
InitList(LA); while (true)
{
int selectIndex = 0;//增删查所用的索引
int selectValue = 0;//增查所用的值 cout << "1、输入顺序表\t2、输出顺序表\t3、取值\t4、查值\t5、插入\t6、删除\t7、退出" << endl;
cin >> opearateNum;
if (opearateNum == 7)
break;
switch (opearateNum)
{
case 1:
//数据输入
ListInput(LA);
system("pause");
system("cls");
break;
case 2:
//输出顺序表
ListOutput(LA);
system("pause");
system("cls");
break;
case 3: cout << "输入要取第几位:";
cin >> selectIndex;
if (GetElem(LA, selectIndex) == 0)
cout << "没有第" << selectIndex << "位的值" << endl;
else
cout << "第" << selectIndex << "位的值:" << GetElem(LA, selectIndex) << endl;
system("pause");
system("cls");
break;
case 4:
cout << "输入要查找的值:";
cin >> selectValue;
if (LocateElem(LA, selectValue) == 0)
cout << "没有该值!" << endl;
else
cout << "值为" << selectValue << "的内存地址:" << LocateElem(LA, selectValue) << endl;
system("pause");
system("cls");
break;
case 5:
cout << "输入要插入的位置和值(如:第2位插入值为4,输入:2 4):";
cin >> selectIndex >> selectValue;
if (ListInsert(LA, selectIndex, selectValue))
cout << "插入成功!" << endl;
else
cout << "插入失败!" << endl; system("pause");
system("cls");
break;
case 6:
cout << "输入要删除第几位:";
cin >> selectIndex;
if (ListDelete(LA, selectIndex))
cout << "删除成功!" << endl;
else
cout << "删除失败!" << endl;
system("pause");
system("cls");
break;
case 7:
break;
default:
cout << "无效操作,请重新输入!" << endl;
break;
} }
}
C++学习---单链表的构建及操作的更多相关文章
- 单链表上的一系列操作(基于c语言)
单链表的实现分为两种单链表(其实差别并不是很大):带头结点和不带头结点,分别对应下面图中的上下两种. 链表的每一个结点是由两个域组成:数据域和指针域,分别存放所含数据和下一个结点的地址(这都是很明白的 ...
- C++单链表的创建与操作
链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素.链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结 ...
- 单链表的插入删除操作(c++实现)
下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream ...
- 数据结构学习--单链表(python)
概念 链表(linked_list)是物理存储单元上非连续的.非顺序的存储结构,数据元素的逻辑顺序 是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间) ,另一个是指向 ...
- c++学习之单链表以及常用的操作
新学数据结构,上我写的代码. #include <iostream> #include <cstdlib> using namespace std; typedef int E ...
- 单链表无head各种操作及操作实验
#encoding=utf-8 class ListNode: def __init__(self,x): self.val=x; self.next=None; #链表逆序 def revers ...
- C++学习---顺序表的构建及操作
#include<iostream> #include<fstream> using namespace std; #define MAXLEN 100 //定义顺序表 str ...
- C++ 单链表操作总结
第一.单链表的定义和操作 #include <iostream> using namespace std; template <typename T> struct Node ...
- C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
随机推荐
- SpringCloud实战 | 第四篇:SpringCloud整合Gateway实现API网关
一. 前言 微服务实战系列是基于开源微服务项目 有来商城youlai-mall 版本升级为背景来开展的,本篇则是讲述API网关使用Gateway替代Zuul,有兴趣的朋友可以进去给个star,非常感谢 ...
- matlab数字图像简单的加密方法
图像加密的重要性可想而知,每个人都会有自己的小秘密,通过图像加密的方法可以保护自己的照片等的安全. 一般情况下,图像加密可以分为以下几个步骤: 1.选择图像加密算法 2.根据算法获取秘钥 3.根据保存 ...
- docker自己部署一个项目
老祖宗的话说得好呀:实践出真知 自己打个简单的镜像运行 遇到了一堆破问题 学习docker主要在菜鸟教程 https://www.runoob.com/docker/docker-containe ...
- tomcat源码之概述
tomcat架构及常用的组件如下: Server Server代表了tomcat服务器,Tomcat启动时即会启动一个server实例,它监听在8005端口以接收shutdown命令,使用 telne ...
- java 集合删除数据
public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asL ...
- robots检测插件编写
首先先把url分割 url = 'https://www.baidu.com/s?wd=123&rsv_spt=1&rsv_iqid=0x8d22781d000014ad&is ...
- Vue+Java+Base64实现条码解析
前端部分(Vue + Vant) 引入Vant.使用Vant中的Uploader组件上传文件(支持手机拍照) import Vue from 'vue'; import { Uploader } fr ...
- 堆的源码与应用:堆排序、优先队列、TopK问题
1.堆 堆(Heap))是一种重要的数据结构,是实现优先队列(Priority Queues)首选的数据结构.由于堆有很多种变体,包括二项式堆.斐波那契堆等,但是这里只考虑最常见的就是二叉堆(以下简称 ...
- spring-boot autoConfiguration
一, 第一个待注入类 public class CacheService { } public class LoggerService { } 方法一, 实现接口ImportSelectort pub ...
- 【译】使用 WebView2 将最好的 Web 带到 .NET 桌面应用程序中
在去年的 Build 大会上,我们引入了 WebView2,这是一个浏览器控件,可以用新的基于 Chrome 的 Microsoft Edge 来呈现 Web 内容(HTML / CSS / Java ...