#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. linux定时重启服务器

    需求说明 系统配置低了,且应用程序内一直在执行定时任务,在程序运行一段时间后,发现接口请求会变得很慢,需要每天定时凌晨重启服务器 脚本实现 1. linux 终端输入crontab -e,添加定时任务 ...

  2. git个人常用命令

    git https://www.cnblogs.com/chenwolong/p/GIT.html 添加当前目录的所有文件到暂存区 $ git add . 提交暂存区到仓库区 $ git commit ...

  3. 吾日三省吾身 java核心代码 高并发集群 spring源码&思想

    阿里面试题    未解决https://my.oschina.net/wuweixiang/blog/1863322 java基础  有答案  https://www.cnblogs.com/xdp- ...

  4. hystrix源码之插件

    HystrixPlugins 获取并发相关类(HystrixConcurrencyStrategy).事件通知类(HystrixEventNotifier).度量信息类(HystrixMetricsP ...

  5. DRF序列化、认证、跨域问题

    初级 #models.py from django.db import models class User(models.Model): user = models.CharField(max_len ...

  6. GEKCTF2020-web

    GEKCTF [GKCTF2020]CheckIN97 <title>Check_In</title> <?php highlight_file(__FILE__); c ...

  7. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  8. 03 以Hello World为例,分析C语言的最小的程序结构

    C程序主要包含的部分 预处理器指令 函数 变量 语句 & 表达式 注释 C Hello World 实例 如下程序,可以在屏幕输出短句"Hello World" #incl ...

  9. 解决FAT32格式U盘安装Windows 10时的报错(错误代码:0x8007000D)

    一.现象描述 使用UltraISO软碟通将 Windows 10 version 1909 刻录到U盘内来安装系统. 从U盘启动安装过程中,报错如下: "Windows 无法打开所需的文件 ...

  10. ansible-初始playbook安装nginx

    1. ansible-初始playbook安装nginx 1) 创建一个ansible存放路径 1 [root@test-1 scripts]# mkdir -p /ansible/nginx/{co ...