数据结构与算法 实验二:利用单链表(实现ADT)判断回文
必须要有两个 .h
文件 和一个 .cpp
文件,一个定义,一个实现,一个解决问题;
LinkedList.h
#ifndef LINKEDLIST_H_
#define LINKEDLIST_H_
#include <iostream>
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int status;
typedef struct LNode
{ElemType data;//数据域LNode *next;//指针域
} LNode, *LinkList;//定义结点和链表status CreatLkList(LinkList &L, int n); //前插法创建n个元素的链表
status InsertLkList(LinkList &L, int i, ElemType e);//在第i个位置插入元素e
status DeleteLkList(LinkList &L, int i); //删除第i个元素
status DeleteLkList(LinkList &L, ElemType mmin, ElemType mmax);//删除区间(mmin,mmax)的元素
status DestoryLkList(LinkList &L); //销毁链表
int FindOrInsert(LinkList &L, ElemType x); //查找元素返回位序没有将其插入合适位置
LNode* reverseList(LinkList &L, int flag); //递归反转链表
// std::ostream& operator<<(std::ostream& os, LinkList L); //重载<<打印链表
#endif // !LINKEDLIST
SingleLinkedList.h
#include "LinkedList.h"
using namespace std;status CreatLkList(LinkList &L, string s) //前插法创建,顺序与输入顺序相反
{L = new LNode; //创建头结点L->next = NULL;int len = s.size();for (int i = len; i >= 0; i--){LNode *p = new LNode;p->data = s[i];p->next = L->next;L->next = p;}// LNode *t = L->next;// while (t)// {// t = t->next;// }L = L->next;return OK;
}status InsertLkList(LinkList &L, int i, ElemType e)
{LNode *p = L;int j = 0;//i的合法范围为1~L.length+1while (p && j < i - 1) //定位到第i-1个结点{p = p->next;j++;}if (!p || j > i - 1) //i>L.length或i<1return ERROR;LNode *t = new LNode; //创建新结点t->data = e;t->next = p->next;p->next = t; //插入到第i-1个后面return OK;
}status DeleteLkList(LinkList &L, int i)
{LNode *p = L;int j = 0;//i的合法范围为1~L.lengthwhile (p->next && j < i - 1){p = p->next;j++;}if (!p->next || j > i - 1) //i>L.length+1或i<1{cout << "\nThe value of i is out of bounds!\n";return ERROR;}LNode *t = p->next; //临时保存被删结点p->next = t->next;delete t;return OK;
}status DeleteLkList(LinkList &L, ElemType mmin, ElemType mmax)
{LNode *pre = L; //初始头节点,修改前驱LNode *now = pre->next; //当前工作指针LNode *t; //临时缓存while (now && now->data < mmax) //因升序,大于mmax提前跳出{if (now->data > mmin && now->data < mmax){t = now;now = now->next;pre->next = now;delete t;}else{pre = pre->next;now = now->next;}}return OK;
}status DestoryLkList(LinkList &L)
{LNode *t;while (L){t = L; //保存头节点L = L->next;delete t;}cout << "\nThe LinkList is Destoryed!\n";return OK;
}
int FindOrInsert(LinkList &L, ElemType x)
{int i = 0;LNode *pre = L;LNode *now = pre->next;while (now && now->data <= x){if (now->data == x) //找到返回位序return i;now = now->next;pre = pre->next;i++;}LNode *t = new LNode;t->data = x;t->next = now;pre->next = t;cout << "未找到 " << x << " 将其插入成功!\n";return 0; //失败返回位序0
}LNode *reverseList(LinkList &L, int flag) //flag当前是否指向头结点标签
{if (!L->next || (!L->next->next && flag == 1)) //空表或一个元素return NULL;if (!L->next->next) //递归出口,L指向倒数第2个结点{LNode *tair = L->next; //保存尾结点tair->next = L;L->next = NULL;return tair; //返回尾节点}else{LNode *tair = reverseList(L->next, 0);if (flag) //L指向头结点{L->next->next = NULL; //原首元结点指向空L->next = tair; //头结点指向原尾结点}else //指向L指向首元结点到倒数第3个结点{L->next->next = L;L->next = NULL;}return tair;}
}// ostream &operator<<(ostream &os, LinkList L)
// {// LNode *p = L->next;
// if (!p)
// {// os << "The empty LinkedList" << endl;
// return os;
// }
// cout << "L->";
// while (p)
// {// os << p->data << "->";
// p = p->next;
// }
// os << "NULL";
// return os;
// }
main.cpp
#include "SingleLinkedList.h"
#include <iostream>
using namespace std;int main()
{LinkList L;string s;cin >> s;CreatLkList(L, s);int len = s.size();int i = len - 1;while (L && i >= 0){if (L->data != s[i]){cout << "no" << endl;return 0;}L = L->next;i--;}if (L->next == NULL && i == -1){cout << "yes" << endl;return 0;}else{cout << "no" << endl;return 0;}
}
说实话,这根本不需要ADT做什么事,但老师非要三个文件;
数据结构与算法 实验二:利用单链表(实现ADT)判断回文相关推荐
- 数据结构与算法(二)单链表(Singly linked list)
数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...
- 【Java数据结构与算法】第二章 单链表及简单面试题
第二章 单链表 文章目录 第二章 单链表 一.单链表 1.基本介绍 2.思路 3.代码实现 二.简单面试题 1.求单链表中有效节点的个数 2.查找单链表中的倒数第k个节点(新浪面试题) 3.单链表的反 ...
- 【数据结构与算法】带环单链表查找环的入口算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...
- Java数据结构与算法———(8)单链表应用实例,删除节点,根据输入的整数
在单链表中,根据输入的节点编号删除对应的节点 一.代码 import java.util.Scanner;public class SingleLinkedListDemo {public stati ...
- Java数据结构与算法———(10)单链表应用实例,找到单链表中倒数第K个节点
找到单链表中的倒数第K个节点,并打印输出节点.两段代码,思路都是相似的. 一.代码1 public class SingleLinkedListDemo {public static void mai ...
- Java数据结构和算法:数组、单链表、双链表
1. 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的 ...
- c语言实现单链表数据结构,数据结构与算法-C语言实现单链表,以及单链表的常用方法...
C语言知识点提要: Struct:Struct 内可放置各种类型的数据 格式为: Struct TagName { .............(元素类型 元素名称) } 不同Struct内的成员名称可 ...
- (数据结构与算法)数组和单链表实现栈的基本操作
数组实现栈 栈接口 public interface Stack<E> {int getSize();boolean isEmpty();void push(E e);E pop();E ...
- 数据结构与算法之Python实现——单链表
最新文章
- 【vijos】P1448 校门外的树
- php源码中如何添加滚动公告,如何给WordPress网站添加滚动公告?
- Scrapy Django项目
- python高级应用_Python高级编程技巧
- Tornado帮助文档组织(zt)
- jquery页面跳转带cookie_搭建谷歌浏览器无头模式抓取页面服务,laravelgt;phpgt;pythongt;docker...
- android系统性能优化(13)---Android性能优化典范 - 第1季
- 学python买什么书-想学python看哪些书
- SAP打印脱机请求和输出请求管理
- 公里导线时有没有计算机类计算方法,基于Matlab的导线网坐标计算. (1).doc
- python一百行代码的项目_用python一百行代码实现xss扫描工具
- 网络安全笔记(一)网络安全设备
- 迅捷pdf编辑器是如何编辑pdf文件的
- Android代码修改SIM的PIN码,关于设置SIM卡PIN码及查询PUK码的教程
- datax底层原理_Datax 任务分配原理
- Linux 监控网络流量
- DxO FilmPack破解版|DxO FilmPack Elite 5.5.23破解版下载(附破解补丁)
- Java实现机器人用户随机上线
- 【自然语言处理-2】word2vec词嵌入算法“男人”+“女人”=“爱情的坟墓”
- ubuntu18 编译maplab opencv3_catkin 时出现Flow control statements are not properly nested.
热门文章
- Java内存溢出异常(下)
- Maven学习(三)-----Maven本地资源库
- 5、UmbracoNewsSite:添加css和js文件
- 做购物车系统时利用到得几个存储过程
- mpvue构建小程序(步骤+地址)
- .Net实现发送邮件功能
- JavaScript.Remove
- 最短路 + 搜索 + 剪枝 之 hdu 4848 Wow! Such Conquering!
- 使用DevExpress的WebChartControl控件绘制图表(柱状图、折线图、饼图)
- leetcode Distinct Subsequences