动态deque中的C++元素

C++ Elements in dynamic deque

本文关键字:元素 C++ 中的 deque 动态      更新时间:2023-10-16

我在从文本文件向deque添加元素时遇到问题。文件包含数字,例如:1 2 3 4。但当我试图从文件中提取数字时,deque会多填充一个数字。

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <stdio.h>
using namespace std; 
int temp;
int br = 1;
struct delem
{
    int key;
    delem *next;
} *l = NULL, *r = NULL;
void push_l(int n) 
{
    delem *p;      
    p = l;           
    l = new delem;     
    l->key = n; 
    l->next = p;             
    if (r == NULL) 
    {
        r = l;
    }
}
void push_r(int n)             
{
    delem *p;           
    p = r;             
    r = new delem;    
    r->key = n;               
    r->next = NULL;   
    if (l == NULL)             
    {
        l = r; 
    }
    else                 
        p->next = r; 
}
int pop_l(int &n)             
{
    delem *p;                
    if (l)                     
    {
        n = l->key;        
        p = l;                  
        l = l->next;    
        if (l== NULL)             
            r = NULL;         
        delete p;             
        return 1;
    }
    else
        return 0;
}
int pop_r(int &n)
{
    delem *p;                 
    if (r)                     
    {
        n = r->key;                
        if (l == r)           
        {
            delete r;          
            l = r = NULL;  
        }
        else
        {
            p = l;                     
            while (p->next != r)
                p = p->next;                   
                //p++;
                n = r->key;                        
                p->next = NULL;         
                delete r;                  
                r = p;                    
                return 1;
        }
       }
       else
       return 0;
}
void get(int n)
{
    int i, t;
    for (i = 1; i < br; i++) 
    {
        pop_l(t); 
        if (i == n)
        {
            temp = t;
        }
        push_r(t); 
    }
}
void print_deque()
{
    for (int i = 1; i<br; i++) 
    {
        get(i);
        cout << temp << " ";
    }
}
void find_number()
{
    int n;
    int total = 0;
    int count = 0;
    double average = 0;
    ifstream deque_file;
    deque_file.open("deque.txt", ios::in);
    if (deque_file)
    {
        while (!deque_file.eof())
        {
            deque_file >> n;
            push_l(n);
        }
        while(pop_l(n))
        {
            total+=n;
            count++;
        }
        average = total/count;
        cout<<"nnSum: " << total << " Count: " << count << " Average: " << average << endl << endl;
    }
    else
        cout << "Error while opening input file!" << endl;
    deque_file.close();
}
int main()
{
    int ch;
    ifstream fd;
    fd.open("deque.txt", ios::in);
    while (fd)
    {
        fd >> ch;
        push_r(ch);
        br++;
    }
    print_deque();
    find_number();
    system("pause");
    return 0;
}

如何避免最后一个数字加两次?

不要执行while (fd)(或while (!fd.eof()))。

而是执行while (fd >> ch)

原因是eofbit标志直到您第一次尝试从文件末尾以外读取时才被设置,从而导致循环一次对多次迭代。