下面是使用双向链表的修改代码:
”`cpp #ifndef NULL #define NULL 0 #endif
#include
using namespace std;
struct LNode {
int month;
int day;
string name;
double price;
LNode* prev; // 前驱指针
LNode* next; // 后继指针
LNode() {};
LNode(int a, int b, string c, double d, LNode* p = NULL, LNode* n = NULL)
: month(a), day(b), name(c), price(d), prev(p), next(n) {};
};
class List { public:
int _size;
LNode* head;
void init() {
head = new LNode();
head->prev = NULL;
head->next = NULL;
_size = 0;
}
public:
List() { init(); }
~List() {
while (head != NULL) {
LNode* p = head->next;
delete head;
head = p;
}
_size = 0;
}
public:
// 头插法
void insert(int& a, int& b, string& c, double& d) {
_size++;
if (head == NULL) {
return ;
}
LNode* p = new LNode(a, b, c, d);
if (head->next != NULL) {
p->next = head->next;
head->next->prev= p;
}
p ->prev= head ;
head -> next=p ;
};
//在指定位置插入元素
void insert(int index,int a, int b, string c, double d) {
while (index <= 0 || index > _size + 1)
{
return;
}
_size++;
LNode* p = head;
for(int i=0; i<index-1; i++){
p=p->next;
}
LNode* tmp = new LNode(a,b,c,d);
if(p->next!=NULL){
p -> next ->prev=tmp;
tmp -> next=p->next;
}else{
// 尾部插入
p->next=tmp;
tmp->prev=p;
}
tmp ->prev=p ;
};
void print_L() {
LNode* p=head -> next ;
while (p != NULL) {
cout << p->month << " " << p->day << " ";
p = p->next;
}
cout << endl;
};
int located(int a,int b) {
LNode* p = head -> next ;
int e = 1 ;
if(p == NULL ) return e ;
while(p!=NULL){
if(a <p -> month ){
e++ ;
p=p ->next ;
if(p==NULL){
return e ;
}
} else if (a>p -> month )
{
return e ;
}else if (a ==p -> month ){
if(b<p->day){
e++;
p=p->next ;
if(p==NULL){
return e ;
}
} else if(b>p->day ){
return e ;
}else if(b==p -> day ){
return e ;
}
}
}
};
};
int main() {
int m, n;
string str;
string c;
double d;
List L1;
double ave1 = 0;
double ave2 = 0;
cin >> m >> n;
for (int i = 0; i < m; i++) {
cin >> str >> c >> d;
int a = stoi(str, 0, 10);
if (a >= 10)
str.erase(0, 3);
else
str.erase(0, 2);
int b = stoi(str, 0, 10);
int e = L1.located(a,b) ;
L1.insert(e,a,b,c,d) ;
}
//L1.print_L();
double sum1=0 ;
int count1=0 ;
double sum2=0 ;
int count2=0 ;
LNode* p=L1.head->next ;
for(int i=0;i<m;i++){
if(count1>=n){
break ;
}else{
if(p -> name=="keyboard"){
sum1+=p ->price ;
p=p -> next ;
count1++ ;
} else if(p-> next !=NULL ) p=p->next ;
}
}
LNode* s=L1.head->next ;
for(int i=0;i;i++){
if(count2>=n){
break ;
}else{
if(s -> name=="mouse"){
sum2+=s ->price ;
s=s -> next ;
count2++ ;
}else if(s-> next !=NULL ) s=s->next ;
}
}
cout << fixed << setprecision(1) <<sum1/n<<endl;
cout <<fixed << setprecision(1)<<sum2/n<<endl;
return 0;
}
”`
内容由零声教学AI助手提供,问题来源于学员提问