一、 实验目的

1、掌握线性表的逻辑结构

2、熟练掌握线性表的链式存储结构定义及基本操作

3、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力

二、 实验要求

1、演示程序运行结果

2、分析调试过程中出现的现象

3、总结单链表基本操作的特点

4、分析算法的时间复杂度

三、实验内容

编写程序,实现单链表的创建、插入和删除等基本操作算法。

(1) 创建带头结点的单链表。

(3) 查找值为给定值的元素,如果找到返回其位序,否则返回0

(4) 在单链表的特定位置插入任意元素并输出单链表中的各元素值。

(5) 在单链表的特定位置删除任意元素并输出单链表中的各元素值。

#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型struct Book {string id;//ISBNstring name;//书名double price;//定价
};
typedef struct LNode {Book data; //结点的数据域struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型string head_1, head_2, head_3;
int length;Status InitList_L(LinkList &L) { // 单链表的初始化//构造一个空的单链表LL = new LNode; //生成新结点作为头结点,用头指针L指向头结点L->next = NULL; //头结点的指针域置空return OK;
}Status GetElem_L(LinkList L, int i, Book &e) { // 单链表的取值//在带头结点的单链表L中查找第i个元素//用e返回L中第i个数据元素的值int j;LinkList p;p = L->next;j = 1; //初始化,p指向第一个结点,j为计数器while (j < i && p) { //顺链域向后扫描,直到p指向第i个元素或p为空p = p->next; //p指向下一个结点++j; //计数器j相应加1}if (!p || j > i)return ERROR; //i值不合法i>n或i<=0e = p->data; //取第i个结点的数据域return OK;
} //GetElem_LLNode *LocateElem_L(LinkList L, int e){LinkList p; p=L->next;while(p && p->data.price!=e) p=p->next;return p;// 按值查找//在带头结点的单链表L中查找值为e的元素} //LocateElem_LStatus ListInsert_L(LinkList &L, int i, Book &e) { // 单链表的插入//在带头结点的单链表L中第i个位置插入值为e的新结点int j;LinkList p, s;p = L;j = 0;while (p && j < i - 1) {p = p->next;++j;}//查找第i?1个结点,p指向该结点if (!p || j > i - 1)return ERROR; //i>n+1或者i<1s=new LNode;             //生成新结点*s s->data=e;          //将结点*s的数据域置为es->next=p->next;       //将结点*s的指针域指向结点aip->next=s;         //将结点*p的指针域指向结点*s++length;return OK;
} //ListInsert_LStatus ListDelete_L(LinkList &L, int i) { // 单链表的删除//在带头结点的单链表L中,删除第i个位置 LinkList p, q;int j;p = L;j = 0;while ((p->next) && (j < i - 1)) //查找第i?1个结点,p指向该结点{{p=p->next;++j;}   }if (!(p->next) || (j > i - 1))return ERROR; //当i>n或i<1时,删除位置不合理 q = p->next; //临时保存被删结点的地址以备释放 p->next = q->next; //改变删除结点前驱结点的指针域 delete q; //释放删除结点的空间 --length;return OK;
} //ListDelete_Lvoid CreateList_H(LinkList &L, int n) { // 前插法创建单链表//逆位序输入n个元素的值,建立到头结点的单链表LLinkList p;L = new LNode;L->next = NULL; //先建立一个带头结点的空链表length = 0;fstream file;file.open("book.txt");if (!file) {cout << "未找到相关文件,无法打开!" << endl;exit(ERROR);}file >> head_1 >> head_2 >> head_3;while (!file.eof()) {p = new LNode; //生成新结点*pfile >> p->data.id >> p->data.name >> p->data.price; //输入元素值赋给新结点*p的数据域p->next = L->next;L->next = p; //将新结点*p插入到头结点之后length++;//同时对链表长度进行统计}file.close();
} //CreateList_Fvoid CreateList_R(LinkList &L, int n) { // 后插法创建单链表//正位序输入n个元素的值,建立带表头结点的单链表L LinkList p, r;L = new LNode;L->next = NULL; //先建立一个带头结点的空链表r = L; //尾指针r指向头结点length = 0;fstream file; //打开文件进行读写操作file.open("book.txt");if (!file) {cout << "未找到相关文件,无法打开!" << endl;exit(ERROR);}file >> head_1 >> head_2 >> head_3;while (!file.eof()) { //将文件中的信息运用后插法插入到链表中p = new LNode;//生成新结点file >> p->data.id >> p->data.name >> p->data.price;//输入元素值赋给新结点*p的数据域p->next = NULL;r->next = p;//将新结点*p插入尾结点*r之后       r = p;//r指向新的尾结点*plength++; //同时对链表长度进行统计}file.close();
} //CreateList_Lint main() {int a, n, choose;double price;Book e;LinkList L, p;cout << "1. 建立\n";cout << "2. 输入\n";cout << "3. 取值\n";cout << "4. 查找\n";cout << "5. 插入\n";cout << "6. 删除\n";cout << "7. 输出\n";cout << "0. 退出\n\n";choose = -1;while (choose != 0) {cout << "请选择:";cin >> choose;switch (choose) {case 1: //建立一个单链表if (InitList_L(L))cout << "成功建立链表!\n\n";break;case 2: //使用后插法创建单链表CreateList_R(L, length);cout << "输入 book.txt 信息完毕\n\n";break;case 3: //单链表的按序号取值cout << "请输入一个位置用来取值:";cin >> a;if (GetElem_L(L, a, e)) {cout << "查找成功\n";cout << "第" << a << "本图书的信息是:\n";cout << left << setw(15) << e.id << "\t" << left << setw(50)<< e.name << "\t" << left << setw(5) << e.price << endl<< endl;} elsecout << "查找失败\n\n";break;case 4: //单链表的按值查找cout << "请输入所要查找价格:";cin >> price;if (LocateElem_L(L, price) != NULL) {cout << "查找成功\n";cout << "该价格对应的书名为:" << LocateElem_L(L, price)->data.name<< endl << endl;} elsecout << "查找失败! 定价" << price << " 没有找到\n\n";break;case 5: //单链表的插入cout << "请输入插入的位置和书的信息,包括:编号 书名 价格(用空格隔开):";cin >> a;cin >> e.id >> e.name >> e.price;if (ListInsert_L(L, a, e))cout << "插入成功.\n\n";elsecout << "插入失败!\n\n";break;case 6: //单链表的删除cout << "请输入所要删除的书籍的位置:";cin >> a;if (ListDelete_L(L, a))cout << "删除成功!\n\n";elsecout << "删除失败!\n\n";break;case 7: //单链表的输出cout << "当前图书系统信息(链表)读出:\n";p = L->next;while (p) {cout << left << setw(15) << p->data.id << "\t" << left << setw(50) << p->data.name << "\t" << left << setw(5)<< p->data.price << endl;p = p->next;}cout << endl;break;}}return 0;
}

数据结构实验三 线性表的链式存储结构及实现相关推荐

  1. 【数据结构】CH2 线性表的链式存储结构

    目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...

  2. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  3. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  4. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  5. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  6. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

  7. 数据结构-线性表(链式存储结构)

    线性表(链式存储结构) 特点: 用一组任意的存储单元存储线性表的数据结构,这组存储单元可以是连续的,也可以是不连续的. 对数据结构ai来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直 ...

  8. 数据结构开发(5):线性表的链式存储结构

    0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...

  9. 线性表(链式存储结构)

    前言 线性表(顺序存储结构-用数组描述) 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的, ...

  10. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

最新文章

  1. Blender终极角色创造:从初学者到专业人士
  2. CSS之Background-clip属性
  3. nlp中的经典模型(三)
  4. Redis 压缩列表原理与应用分析
  5. react map循环生成的button_常见 React 面试题
  6. 关于C++标准库中的数据抽象
  7. 算法:First Missing Positive(求缺失的第一个正整数)
  8. Java 就业培训教程 再读笔记
  9. GEE生成京津冀区域VIIRS 夜间灯光数据
  10. AD14 如何设置PCB板框大小及形状
  11. 计算机量子化学计算焓,第一章、量子化学积分一——Slater函数
  12. 计算周数的方式 - 现在是今年的第几周?
  13. 管理者该如何思考团队建设
  14. 【EDM邮件营销】独立站卖家如何通过用户标签提高EDM邮件打开率
  15. 利用UE4深度图制作空间开敞度可视化工具
  16. eclipse自动排版快捷键 按了没有用 的解决办法
  17. nslookup命令详解和实战例子(全)
  18. mysql索引默认是什么意思_MySQL索引的理解
  19. 数据库设计报告——用教材管理系统来举例
  20. 数学建模写作排版——LaTeX

热门文章

  1. 苹果游戏投屏电脑控制
  2. 小米原装系统镜像列表
  3. JavaWeb 图书管理系统
  4. VScode中快速生成vue模板
  5. Android addr2line 工具使用
  6. nb信号和4g信号_nb信号和4g信号_NB-IoT的网络如何组成,以及数据如何传输?
  7. 惠普服务器DL380 Gen10/Gen9宕机重启
  8. qtdesigner页面布局
  9. 如何下载南开区卫星地图高清版大图
  10. 微信小程序发送服务通知(模板消息)前后端实现代码附效果图