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语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
随机推荐
- JVM垃圾回收行为的并行与并发
程序的并行和并发 程序的并发(Concurrent) 在操作系统中,是指一个时间段中有几个程序都处于己启动运行到运行完毕之间,且这几个程序都是在同一个处理器_上运行. 并发不是真正意义上的“同时进行” ...
- Java沙箱安全机制介绍【转载】
沙箱安全机制的应用层面:360沙箱.win10沙箱.包括VMware Workstation.Oracle VM VirtualBox都可以充当沙箱去使用,沙箱中的操作与本机无关,进而保证本机的安全性 ...
- springboot、Thymeleaf、国际化的简单使用
1.项目体系结构 (1)知识体系 springboot:省去了很多繁琐的配置,如:视图解析器.前端控制器等 thymeleaf:获取controller数据逼能够进行展示 集合:用于存储数据,此练习没 ...
- jekins使用的坑
1.日志打满 一个周末回来,服务器的磁盘就写满了 现象如下,最后是修改catalina脚本 添加了如下配置 ###jekins log problem#########export JAVA_OPTS ...
- spring mvc(1) 为什么要使用mvc
在使用spring mvc之前,我们首先要理解我们为什么要使用spring mvc.关于这个问题我们可以看一下java web的简单发展过程. 1. servlet 开发阶段 上世纪90年代,随着In ...
- java安全编码指南之:可见性和原子性
目录 简介 不可变对象的可见性 保证共享变量的复合操作的原子性 保证多个Atomic原子类操作的原子性 保证方法调用链的原子性 读写64bits的值 简介 java类中会定义很多变量,有类变量也有实例 ...
- Istio 运维实战系列(3):让人头大的『无头服务』-下
本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 失败的 Eur ...
- selenium学习之基本操作(一)
通过selenium的使用可以驱动浏览器来模拟加载网页,简单定位元素和获取对应的数据:# find_elements_by_id #(根据id属性值获取元素列表)# find_elements_by_ ...
- C++中的In 和 Out用法
参考:https://zhidao.baidu.com/question/541219383.html In 这是一个宏,它的实际意义就是告诉你,这个变量或参数是输入值,即你必须给这个变量填写好以后提 ...
- spring-boot-route(九)整合JPA操作数据库
单调的增删改查让越来越多的程序员感到乏味,这时候就出现了很多优秀的框架,完成了对增删改查操作的封装,只需要简单配置,无需书写任何sql,就可以完成增删改查.这里比较推荐的是Spring Data Jp ...