问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

这是数据结构的实验题,谁能帮我解一下,感激不尽哦

发布网友 发布时间:2022-05-13 08:27

我来回答

2个回答

热心网友 时间:2023-08-14 16:27

以前写的东西……

/*
作者:
学号:
题目:P50 2-3
时间:2010.3.24
说明:仅不带头结点的双循环链表类。提供一个迭代器类。
可以通过迭代器访问它指向的数据元素,迭代器可以向前/向后移动,可以被赋值,
可以判相等,可以删除迭代器指向的数据此元素。
思路:不带头结点需要特殊判断链表为空的情况,删除时要格外小心。
其他:注意迭代器不需要析构函数,它不申请额外空间
*/

#include <iostream>
#include <string>
using namespace std;

//线性表抽象类
template <class T>
class List{
public:
virtual ~List(){};

virtual void clear() = 0;
virtual int length() const = 0;
virtual void insert( int i, const T &x ) = 0;
virtual void remove( int i ) = 0;
virtual int search( const T& ) const = 0;
virtual T visit( int i ) const = 0;
virtual void traverse() const = 0;
};

class OutOfBound{
public:
OutOfBound(){
cout << "访问超出范围!" << endl;
system("pause");
}
};
class EraseError{
public:
EraseError(){
cout << "删除了不存在的结点,删除失败!" << endl;
system("pause");
};
};
class Exception{};

// 双链表类
template <class T>
class Linklist: public List<T>
{
private:
struct Node
{
T data;
Node *next, *prev;

Node( const T &x, Node *p = NULL, Node *n = NULL) { data = x; prev = p; next = n; }
Node(): next(NULL), prev(NULL){}
~Node(){}
};

public:
//迭代器类
class Iterator
{
friend bool operator == ( Iterator a, Iterator b ) {
return ( a.it == b.it ) ? true : false;
}

private:
Node *it;

public:
T visit(){ if ( it == NULL ) throw OutOfBound(); return it->data; }

//赋值迭代器
Iterator & operator = ( Iterator x ){
it = x.it;
return *this;
}

//自增、自减迭代器
Iterator & operator ++(){
if ( it == NULL || it->next == NULL ) throw OutOfBound();
it = it->next;
return *this;
}
Iterator operator ++ (int) {
if ( it == NULL || it->next == NULL ) throw OutOfBound();
Iterator v;
v.it = it;
it = it->next;
return v;
}
Iterator & operator --() {
if( it == NULL || it->next == NULL ) throw OutOfBound();
it = it->prev;
return *this;
}
Iterator operator --(int) {
if ( it == NULL || it->next == NULL ) throw OutOfBound();
Iterator v;
v.it = it;
it = it->prev;
return v;
}

Iterator(){ it = NULL; }
~Iterator() {}
friend class Linklist;
};

private:
Node *head, *tail;
int l;

//移动迭代器到指定结点
Node* move( int i ) const {
Node *p = head;
if ( i < 0 || i > l ) throw OutOfBound();
while (i--) p = p->next;
return p;
}

public:
Linklist();
~Linklist(){ clear(); delete head; delete tail; }

void clear();
int length() const { return l; }
int search( const T &x ) const;
void insert( int i, const T &x );
void remove( int i );
void traverse() const;
T visit( int i ) const;
void erase( Iterator v ){
//删除迭代器指定的结点
try{
v.it->prev->next = v.it->next;
v.it->next->prev = v.it->prev;
if ( v.it == head && l != 0 ) head = head->next;
delete v.it;
--l;
if ( l == 0 ){ head = NULL; tail = NULL; }
} catch ( Exception() ) { throw( EraseError()); };
}
//*
Iterator begin() const { Iterator v; v.it = head; return v; }
Iterator end() const { Iterator v; v.it = tail; return v; }
};

template <class T>
Linklist<T>::Linklist() {
head = NULL; tail = NULL; l = 0;
}

//清空链表
template <class T>
void Linklist<T>::clear() {
Node *p = head, *q;
for ( int i = 0; i < l; ++i ) {
q = p->next;
delete p;
p = q;
}
head = NULL; tail = NULL;
l = 0;
}

//插入链表
template <class T>
void Linklist<T>::insert( int i, const T &x ) {
Node *pos, *tmp;

if ( l == 0 ) {
head = new Node( x, NULL, NULL);
head->prev = head;
head->next = head;
tail = head;
} else {
pos = move(i-1);
tmp = new Node( x, pos, pos->next );
pos->next->prev = tmp;
pos->next = tmp;
if ( i == l ) tail = tmp;
}

++l;
}

//移除链表指定结点
template <class T>
void Linklist<T>::remove( int i )
{
try{
Node *pos;
pos = move(i);
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
if ( i == 0 && l != 0 ) head = head->next;
delete pos;
--l;
if ( l == 0 ){ head = NULL; tail = NULL; }
} catch ( Exception() ) { throw( EraseError()); };
}

//搜寻指定结点
template <class T>
int Linklist<T>::search( const T &x ) const
{
Node *p = head;
int i = 0;

while ( i != l && p->data != x ) { p = p->next; ++i; }
if ( p->data == x ) return i; else return -1;
}

//访问结点
template <class T>
T Linklist<T>::visit( int i ) const
{
Node *p = move(i);
return p->data;
}

//遍历
template <class T>
void Linklist<T>::traverse() const
{
Node *p = head;
for ( int i = 0; i < l; ++i ){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}

int main(){
int i, n, x;
Linklist<int> a;
Linklist<int>::Iterator v1, v2;

//cin >> n;
cout << "这是一个自动范例,插入 1 2 3 4 5 " << endl;
n = 5;
for ( int i = 0; i != n; ++i ){
x = i + 1;
//cin >> x;
a.insert(i, x);
}
a.traverse();
cout << a.visit(3) << endl;
cout << a.length() << endl;
a.remove(3);
cout << a.search(x) << endl;
cout << a.search(0) << endl;
cout << a.visit(3) << endl;
a.traverse();

v1 = a.begin(); v2 = a.begin();
cout << "v1 == v2 " << (v1 == v2) << endl;
v1 = a.begin(); v2 = a.end();
cout << "v1 == v2 " << (v1 == v2) << endl;

for ( v1 = a.begin(); !(v1 == a.end()); ++v1 ){
cout << v1.visit() << endl;
a.erase(v1);
a.traverse();
}

system("pause");
return 0;
}

热心网友 时间:2023-08-14 16:27

用C语言编写还是JAVA语言编写?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
招聘和招募和招收区别 人力资源中招聘与招募的区别 招聘与招募有啥区别 夏日繁星公众号可信吗 关于“红杏出墙”的古诗词描写有哪些 需要考多少分才过雅思 雅思考试多少分才可以算及格 雅思考试多少分算及格 雅思的总分多少分及格 雅思一般考多少分能合格 2010级数据结构实验题 1、 已知两个按元素值有序的线性表A和B以顺序存储结构表示,编程实现:将A和B有序归 自己买股票能模仿基金定投的方式吗?哪个业绩会好点 基金定额定投,是买股票基金,还是买指数基金好 定投股票更靠谱吗 定投股票行吗 只能定投基金吗,定投股票行不行 基金定投的方式可以用在股票上吗 如果你能做到这一点或许可以 买股票能不能用定投的方法呢? 您好!请问门头沟的发展情况如何? 北京云栖雅苑优劣势? 合肥融创乐园离哪个高铁站最近 求助,FireFox DIV随鼠标移动(获取鼠标坐标的问题) 无锡南禅寺坐地铁几号线?坐到哪离融创乐园最近 融创津宸壹号在哪里,怎么样,周边有什么地铁? 融创云翠离地铁站多远 医保卡怎么申请大病险 医保卡哪里来的是国家的还是保险公司的目前的大病医保包括哪些 把决明子,荷叶,干山楂,玫瑰花,柠檬,红枣泡在一起能减肥吗?多久能减,能减多少 玫瑰、山楂、荷叶、红枣、柠檬、决明子煲水喝对减肥有用吗 红枣 玫瑰花 山楂 枸杞子 荷叶 柠檬 白菊花 熬汤 喝了可以减肥么 数据结构实验题c语言描述,谢谢各位啦!!有两题如下 数据结构上机实验题(刚开始学一头雾水,望C语言高手帮忙) 数据结构实验 数据结构实训题目 c语言数据结构实验 题目请看图 感谢大佬们 手机号停用被封怎么解封? 微信冻结绑定的手机号停用了怎么办? 电脑放歌时的有音乐但是没声音是怎么回事 电脑放音乐没有声音,用酷狗放就有 色懒是什么意思? 懒色这个词是什么意思 给新老师的一封信【六年级,见过几次面】 懒的组词有懒色这个词吗? 一个女人心肠不坏就太色太懒怎么办 如何看待解说陆狸在 PEL总决赛上的表现? “空城”俩字怎么设计好看,当微博名字,加点字符 胶原蛋白对人的好处是? 人类存在地球上多少年了? 天河一号是什么 胶原蛋白对人有什么好处