public void Delete(int i) { if (i<0 || i>size()-1) //参数错误抛出异常 throw new IllegalArgumentException("删除:位置i不在有效范围内"); LinkNode<E> p=geti(i-1); //找到序号为i-1的结点p p.next=p.next.next; //删除p结点的后继结点 System.out.println("删除成功"); } public void travel() { LinkNode<E> p=head; while (p.next!=null) { p=p.next; Book book=(Book)p.data; System.out.println(book); } } public void updateBookNum(int i) { LinkNode<E> p=head; int j=-1; while (j<i) { j++; p=p.next; } // return p; Book book=(Book)p.data; book.setNum(book.getNum()-1); } }
时间: 2024-02-14 12:21:07 浏览: 132
这段代码中是 `LinkListClass` 类中的两个方法:
1. `Delete(int i)`:该方法用于删除链表中指定位置的节点。首先判断位置 `i` 是否在链表的有效范围内,如果不在则抛出异常。然后找到序号为 `i-1` 的节点 `p`,并将 `p` 的后继节点指向 `p.next.next`,从而实现删除操作。
2. `travel()`:该方法用于遍历链表并打印每个节点的数据。从链表头部开始,依次遍历每个节点,并将节点中的 `Book` 对象打印出来。
另外还有一个 `updateBookNum(int i)` 方法,用于更新链表中指定位置的书籍库存。该方法首先找到序号为 `i` 的节点 `p`,然后获取该节点中的 `Book` 对象,并将其库存减1。
需要注意的是,这些方法都是基于链表的实现,因此其时间复杂度与链表的长度相关,适用于数据量较小的场景。如果需要处理大量数据,可以考虑使用其他数据结构,如哈希表、平衡树等。
相关问题
template <class T> class List { date1<T>* pre, * head, * p; int pos = 0; public: List() { this->head = new date1<T>; this->pre = head; } void push(T a) { if (pos <= 1) { p = new date1<T>; p->changedate(a); p->changenext(nullptr); pre->changenext(p); pre = p; pos++; } else if (pos > 1) { p = new date1<T>; p->changedate(a); p->changenext(nullptr); p->changelast(pre); pre->changenext(p); pre = p; pos++; } } void Delete() { date1<T>* a = pre->getlast(); delete[]pre; pre = a; pos--; } T sum() { T sum = 0; date1<T>* a = head->getnext(); while (a != nullptr) { sum += a->getdate(); a = a->getnext(); } return sum; } void order() { date1<T>* a = head->getnext(); date1<T>* b = a->getnext(); while (a->getnext() != nullptr) { while (b != nullptr) { if (a->getdate() <= b->getdate()) { T a1 = a->getdate(); a->changedate(b->getdate()); b->changedate(a1); } b = b->getnext(); } a = a->getnext(); } } void search(T a) { date1<T>* b=head; while (b!= nullptr) { if (b->date == a) { cout << "found it"; return; } b = b->getnext(); } cout << "no found"; } T average() { T sum1 =this->sum(); date1<T>* b = head; int i = 0; while (b != nullptr) { b = b->getnext; i++; } return sum/i; }找出average函数的不足之处并且优化他
average函数的不足之处是它没有考虑到空列表的情况,如果列表为空,它将会抛出除以零的异常。同时,它也没有使用浮点类型来存储平均值,如果对于整数类型的列表,可能会导致精度丢失。
为了优化average函数,我们可以先判断列表是否为空,如果为空则返回默认值,比如-1。另外,我们可以使用浮点类型来存储平均值,这样可以避免精度丢失的问题。
下面是修改后的average函数的代码:
```c++
double average() {
if (pos == 0) {
return -1; // 如果列表为空,返回-1
}
T sum1 = this->sum();
date1<T>* b = head;
int i = 0;
while (b != nullptr) {
b = b->getnext();
i++;
}
return static_cast<double>(sum1) / i; // 使用浮点类型存储平均值
}
```
要求如下:编写一个能为栈也能为队列的线性表,根据要求完善下列代码: #include <iostream> using namespace std; #include<string> #include"math.h" template<class T> class vlist//线性表抽象类 { public: virtual void in(T &e)=0; virtual T out()=0; }; template<class T> class Element//线性表存储元素 { public: T data; Element<T> next; Element(){} }; //在beign和end之间完成SStack和Quene类的定义及实现,其继承vlist /begin/ /end***/ int main() { vlist<int> *intp; vlist<string> *strp; SStack<int> ints; Quene<int> intq; SStack<string> strs; Quene<string> strq; intp=&ints; int t=2; intp->in(t); t=3; intp->in(t); t=4; intp->in(t); for(int i=0;i<3;i++) cout<<intp->out(); intp=&intq; t=2; intp->in(t); t=3; intp->in(t); t=4; intp->in(t); for(int i=0;i<3;i++) cout<<intp->out(); strp=&strs; string str; cout<<endl; for(int i=0;i<3;i++) { cin>>str; strp->in(str); } for(int i=0;i<3;i++) cout<<strp->out()<<" "; cout<<endl; strp=&strq; for(int i=0;i<3;i++) { cin>>str; strp->in(str); } for(int i=0;i<3;i++) cout<<strp->out()<<" "; }
代码如下:
```
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
template<class T>
class vlist // 线性表抽象类
{
public:
virtual void in(T &e) = 0;
virtual T out() = 0;
};
template<class T>
class Element // 线性表存储元素
{
public:
T data;
Element<T>* next;
Element() { next = NULL; }
};
template<class T>
class SStack : public vlist<T> // 栈的实现类
{
private:
Element<T>* top; // 栈顶元素指针
public:
SStack() { top = NULL; }
void in(T &e) // 入栈操作
{
Element<T>* p = new Element<T>;
p->data = e;
p->next = top;
top = p;
}
T out() // 出栈操作
{
if (top == NULL) // 栈空,抛出异常
throw "Stack is empty!";
Element<T>* p = top;
top = top->next;
T temp = p->data;
delete p;
return temp;
}
};
template<class T>
class Quene : public vlist<T> // 队列的实现类
{
private:
Element<T>* front; // 队头元素指针
Element<T>* rear; // 队尾元素指针
public:
Quene() { front = rear = NULL; }
void in(T &e) // 入队列操作
{
Element<T>* p = new Element<T>;
p->data = e;
p->next = NULL;
if (front == NULL)
front = rear = p;
else
{
rear->next = p;
rear = p;
}
}
T out() // 出队列操作
{
if (front == NULL) // 队空,抛出异常
throw "Quene is empty!";
Element<T>* p = front;
front = front->next;
T temp = p->data;
delete p;
return temp;
}
};
int main() {
vlist<int>* intp;
vlist<string>* strp;
SStack<int> ints;
Quene<int> intq;
SStack<string> strs;
Quene<string> strq;
intp = &ints;
int t = 2;
intp->in(t);
t = 3;
intp->in(t);
t = 4;
intp->in(t);
for (int i = 0; i < 3; i++)
cout << intp->out() << " ";
intp = &intq;
t = 2;
intp->in(t);
t = 3;
intp->in(t);
t = 4;
intp->in(t);
for (int i = 0; i < 3; i++)
cout << intp->out() << " ";
strp = &strs;
string str;
cout << endl;
for (int i = 0; i < 3; i++) {
cin >> str;
strp->in(str);
}
for (int i = 0; i < 3; i++)
cout << strp->out() << " ";
cout << endl;
strp = &strq;
for (int i = 0; i < 3; i++) {
cin >> str;
strp->in(str);
}
for (int i = 0; i < 3; i++)
cout << strp->out() << " ";
}
```
这段代码定义了一个 vlist 抽象类,并且定义了两个线性表的实现类:SStack 和 Quene,分别实现了栈和队列的基本操作。在 main 函数中,分别使用了栈和队列的实现类,演示了它们的基本操作。
阅读全文