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语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...
随机推荐
- command三国杀开发日记20200915
一句话进展 完善了程序结构,分离.c和.h 搭建了6个阶段函数 实现了玩家摸牌 封装实现了日志打印函数 日志打印 想要区分日志等级,包括DEBUG.INFO.WARN.ERRRO.PANIC,提供统一 ...
- 记录openssl和openssh升级中遇到的问题以及解决方法
本文档讲述的升级操作是基于操作系统centos6.5,使用的openssl版本是openssl-1.0.2l.tar.gz,openssh版本是openssh-7.6p1.tar.gz. 1. 依赖检 ...
- 云计算openstack核心组件——nova计算服务(7)
一.nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova ...
- HashTable学习
HashTable虽然加上了线程安全,但是源码走向和思想比hashMap还是要简单直白很多,hashmap还得再看,因为很多关键点没有get,下午&明天自己去debug一遍再继续看看博客 脑子 ...
- Java Web学习(三)数据加密方式详解
一.对称加密 定义:加密和解密使用相同密钥的算法. 常见的有DES.3DES.AES.PBE等加密算法,这几种算法安全性依次是逐渐增强的. DES加密 特点:简便.密钥长度比较短. import ja ...
- splunk公司的一道笔试题
题目要求: 一个游泳馆里有很多储物柜,每个储物柜都有一个ID号,但是老板不喜欢4这个数字,所以ID号里都不能有4,ID号从1开始编号,让你设计所有储物柜的ID号,用程序输出,比如输入 4输出 5输 ...
- Java源码赏析(六)Java String 三顾
在大致了解了String之后,可能有的读者发现了,我们并没有谈到CharSequence接口. 原因是在这一节,CharSequence要和StringBuilder(Java1.5).StringB ...
- PHP_Code_Challenge 1~30
1. 1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= <?php error_reporting(0); require __DIR__ ...
- OpenGL的shader编写,GLSL基本语法
重要!!! 文章中涉及到的代码在我的GitHub仓库里应该都能对应找到, 关于学习OpenGL的实操项目一般都会在GLBIproject1,2,...中对应找到 每个仓库中都有不同的版本的项目,更新版 ...
- gRPC-Protocol基础知识-C#篇
本文使用协议缓冲区语言的proto3版本,为C#程序员提供了使用协议缓冲区的基本介绍. 通过创建一个简单的示例应用程序,展示了如何 在.proto文件中定义消息格式. 使用协议缓冲区编译器. 使用C# ...