#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++学习---单链表的构建及操作的更多相关文章

  1. 单链表上的一系列操作(基于c语言)

    单链表的实现分为两种单链表(其实差别并不是很大):带头结点和不带头结点,分别对应下面图中的上下两种. 链表的每一个结点是由两个域组成:数据域和指针域,分别存放所含数据和下一个结点的地址(这都是很明白的 ...

  2. C++单链表的创建与操作

    链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素.链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结 ...

  3. 单链表的插入删除操作(c++实现)

    下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream ...

  4. 数据结构学习--单链表(python)

    概念 链表(linked_list)是物理存储单元上非连续的.非顺序的存储结构,数据元素的逻辑顺序 是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间) ,另一个是指向 ...

  5. c++学习之单链表以及常用的操作

    新学数据结构,上我写的代码. #include <iostream> #include <cstdlib> using namespace std; typedef int E ...

  6. 单链表无head各种操作及操作实验

    #encoding=utf-8 class ListNode: def __init__(self,x): self.val=x; self.next=None;   #链表逆序 def revers ...

  7. C++学习---顺序表的构建及操作

    #include<iostream> #include<fstream> using namespace std; #define MAXLEN 100 //定义顺序表 str ...

  8. C++ 单链表操作总结

    第一.单链表的定义和操作 #include <iostream> using namespace std; template <typename T> struct Node ...

  9. C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

    昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...

随机推荐

  1. k8s运行容器之Job(四)

    Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...

  2. redis部署问题

    在部署redis哨兵的时候,一开始一直都是失败:杀死master进程后,没有选出新的master 日志如下 9985:X 18 Feb 20:14:42.409 # +sdown master mym ...

  3. 基于Prometheus网关的监控完整实现参考

    prometheus 是一个非常好的监控组件,尤其是其与grafana配合之后,更是如虎添翼.而prometheus的监控有两种实现方式.1. server端主动拉取应用监控数据:2. 主动推送监控数 ...

  4. 修改python包pip下载国内源

    第一种方式- pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 附国内常用镜像源:阿里云:https:// ...

  5. pytest封神之路第四步 内置和自定义marker

    可以通过命令行查看所有marker,包括内置和自定义的 pytest --markers 内置marker 内置marker本文先讲usefixtures .filterwarnings .skip ...

  6. Java12新特性

    switch表达式(预览) 传统switch的缺点 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行; 所有的case语句共用一个块范围,在不同的case语句定义的变量 ...

  7. 获取NX特征名称(无时间戳)

    NX获取特征名称使用UF_MODL_ask_feat_name这个接口,接口说明里有一段话: Returns a character string containing the feature typ ...

  8. java安全编码指南之:可见性和原子性

    目录 简介 不可变对象的可见性 保证共享变量的复合操作的原子性 保证多个Atomic原子类操作的原子性 保证方法调用链的原子性 读写64bits的值 简介 java类中会定义很多变量,有类变量也有实例 ...

  9. axios之post提交

    axios官网地址:https://github.com/axios/axios post提交到后台需要做相对应的处理 使用URLSearchParams可以让post 数据提交到后台 对应gitHu ...

  10. 在Linux系统下搭建和配置一个minio文件服务器(二)

    上一篇主要讲述了在linux系统中搭建一个minio文件服务器,那么这一篇则用来整合java代码中使用,我之前自己已经搭建好了一个springboot项目,那么这一篇将详细讲述如何把minio整合进s ...