vvliebelxy 2019-12-16 06:26 采纳率: 0%
浏览 204

关于一个c++链表的程序设计

我现在的问题卡在如果要抓取链表里面的数据并且显示出来,我可能需要创建一个三维的数组用来分别输入月份(Monat),支出类别(Kategorie)还有花费金额(Betrag),同时我要判断每次抓取的数据输入月份以及支出类别是否相同。想请问下有没有更好的思路解决这个问题。题目要求如下:图片说明
我的代码还没写完,大概整体如下:
谢谢各位!

```#include
#include
#include

using namespace std;

class Artikel
{
// friend Deklaration
friend class Rechnungsliste;

private:
int Monat;
string Kategorie;
float Betrag;
int Nummer;

Artikel *nachfolger;

public:
Artikel(int m, string k, float b,int n) : Monat(m), Kategorie(k), Betrag(b),Nummer(n)
{
nachfolger = 0;
}
string get_Kategorie () { return Kategorie; }
float get_Betrag () { return Betrag; }
int get_Monat () { return Monat; }
int get_Nummer(){return Nummer;}
void set_Kategorie (string k) { Kategorie = k; }
void set_Betrag (float b) { Betrag = b; }
void set_Monat (int m) { Monat = m; }
Artikel *next () { return nachfolger; }
void datenausgeben()
{
cout<<get_Monat()<<endl;
cout<<"--------------------------------------------------------------------"<<endl;
cout<<"\t"<<get_Kategorie()<<":\t"<<"\t\t\t"<<get_Betrag()<<"\t"<<"\t"<<get_Nummer()<<endl;
}

};
void Kategorieanzeige()
{
cout<<"[1]\t"<<"Tank"<<endl;
cout<<"[2]\t"<<"Kleidung"<<endl;
cout<<"[3]\t"<<"Urlaub"<<endl;
cout<<"[4]\t"<<"Essen"<<endl;
cout<<"[5]\t"<<"Bus"<<endl;
cout<<"[6]\t"<<"Bahn"<<endl;
cout<<"[7]\t"<<"Schule"<<endl;
cout<<"[8]\t"<<"Fitniss"<<endl;
}

class Rechnungsliste
{
private:
Artikel *anfang;
public:
Rechnungsliste ()
{
anfang = 0;
}
Artikel *begin () { return anfang; }

void einfuegen(Artikel *k)
{
    k->nachfolger = anfang;
    anfang = k;
}
Artikel* finde(int nm)
{
    Artikel *kp;
    for (kp = begin(); kp != 0; kp = kp->next())
        if (kp->get_Monat() == nm)
            break;
    return kp;
}
Artikel* finde(string zl)
{
    Artikel *kp;
    for (kp = begin(); kp != 0; kp = kp->next())
        if (kp->get_Kategorie() == zl)
            break;
    return kp;
}
void remove(int yue)
{
    if(anfang!=NULL)
    {
        if(anfang->get_Monat() == yue) //prüfe ob Anfang unser Satz ist, da es sein kann, dass wir keinen Nachfolger haben
        {
            anfang = anfang->next(); //falls ja, dann ist unser neuer Anfang der Nachfolger
        }
        else if(anfang->get_Monat() != yue && anfang->next() == NULL) //prüfe ob Anfang ungleich Satz ist und ob nächster Datensatz NULL ist
        {
            return;
        }
        else
        {
            Artikel *kp;
            for (kp = begin(); kp != 0; kp = kp->next())
            {
                if(kp->next()->get_Monat() != yue && kp->next()->next() == NULL) //prüfe ob Nachfolger-Satz ungleich meinem Satz und ob Nachfolger vom Nachfolger gleich NULL
                    break;                                                        //wird benötigt, falls wir beim vorletzten sind & letzter ungleich ist, da letzter keine Daten liefert
                else if (kp->next()->get_Monat() == yue) //prüfe ob Nachfolger unser Satz ist
                {
                    kp->nachfolger = kp->next()->next(); //falls ja, dann ist unser neuer Nachfolger der Nachfolger vom Nachfolger des aktuellen Objekts
                    break;
                }
            }
        }
    }
}

bool empty() { return anfang == 0; }
Artikel *clear()
{
// Entfernen eines Knotens vom Anfang der Liste
    Artikel * kp = anfang;
    if (kp != 0)
    {
        cout << kp->get_Monat() << " entfernt." << endl;
        anfang = kp->nachfolger;
        kp->nachfolger = 0;
    }
    return kp;
}

};

Rechnungsliste liste;
v/*oid display_by_month()
{
Artikel*kp=NULL;
float display_month[12][8];
for(int i=0;i {
for(int j=0;j {
display_month[i][j]=0.0;
}
}
for(kp=liste.begin();kp!=0;kp=kp->next())
switch(kp->get_Monat())
{
case 1:
int index_month=kp->get_Monat();
display_month[index_month][0]+=kp->get_Betrag();
break;
case 2:
int index_month=kp.get_Monat();
display_month[index_month][1]+=kp->get_Betrag();
break;
case 'Urlaub':
int index_month=kp.get_Monat();
display_month[index_month][2]+=kp->get_Betrag();
break;
case 'Essen':
int index_month=kp.get_Monat();
display_month[index_month][3]+=kp->get_Betrag();
break;
case 'Bus':
int index_month=kp.get_Monat();
display_month[index_month][4]+=kp->get_Betrag();
break;
case 'Bahn':
int index_month=kp.get_Monat();
display_month[index_month][5]+=kp->get_Betrag();
break;
case 'Schule':
int index_month=kp.get_Monat();
display_month[index_month][6]+=kp->get_Betrag();
break;
case 'Fitniss':
int index_month=kp.get_Monat();
display_month[index_month][7]+=kp->get_Betrag();
break;
default:
break;
}
}
*/
void erfassen() // Artikel erfassen
{

int Monat;
float Betrag;
string Kategorie;
int Nummer;
int nr=0;
cout<<"Nummer: "<<endl;
cin>>Nummer;
Artikel *tmpArtikel = NULL;
tmpArtikel = liste.finde(Nummer);
if (tmpArtikel == 0)
{
cout<<"Monat: "<<endl;
cin>>Monat;
Kategorieanzeige();
cout<<"Nummer von Kategorie: "<<endl;
cin>>nr;
switch(nr)
    {
    case 1:
        {
            Kategorie="Tank";
            break;
        }
    case 2:
        {
            Kategorie="Kleidung";
            break;
        }
    case 3:
        {
            Kategorie="Urlaub";
            break;
        }
    case 4:
        {
             Kategorie="Essen";
            break;
        }
    case 5:
        {
             Kategorie="Bus";
            break;
        }
    case 6:
        {
             Kategorie="Bahn";
            break;
        }
    case 7:
        {
             Kategorie="Schule";
            break;
        }
    case 8:
        {
             Kategorie="Fitniss";
            break;
        }
    default:
        {
           cout<<"Falsche auswahl."<<endl;
            system("pause");
            break;
        }

    }
    cout<<"Betrag: "<<endl;
    cin>>Betrag;
    cout<<"Monat: "<<Monat<<" "<<"Kategorie: "<<Kategorie<<" "<<"Betrag: "<<Betrag<<"Euro"<<" "<<"Rechnungsnummer: "<<Nummer<<endl;
    Artikel *objekt = new Artikel(Monat,Kategorie,Betrag,Nummer); //neues Objekt mit neu zugewiesener Adresse erstellen
    liste.einfuegen(objekt);
    cout << "Artikel hinzugef\201gt." << endl;
    }
else
{
    cout << "Artikel " << Nummer << " bereits vorhanden. " << endl;

}

}
void aendern() // Artikel ändern
{
int Monat;
float Betrag;
string Kategorie;
int nr=1,auswahl;
Artikel *objekt;

cout<<"Monat\t Kategorie\t Betrag\t"<<endl;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
    cout << "[" << nr << "]\t";
    objekt->datenausgeben();
    cout << endl;
    nr++;
}
    cout << "Welcher Artikel soll geaendert werden?" << endl << "Nummer eingeben: ";
do
{
    cin >> auswahl;
}while(auswahl <= 0 || auswahl >= nr);

nr = 1;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
    if(auswahl==nr)
        break;
    nr++;
}

system("cls");

cout << "Was soll abgeaendert werden?" << endl << "[1] Monat: " << objekt->get_Monat() << endl << "[2] Kategorie: " << objekt->get_Kategorie() << endl << "[3] Betrag: " << objekt->get_Betrag() << endl << "Nummer eingeben: ";
do
{
    cin >> auswahl;
}while(auswahl <= 0 || auswahl >= 4);

if(auswahl==1)
{
    cout << "Neue Monat: ";
    cin >> Monat;
    objekt->set_Monat(Monat);
}
else if(auswahl==2)
{
    cout << "Neue Kategorie: ";
    cin >> Kategorie;
    objekt->set_Kategorie(Kategorie);
}
else if(auswahl==3)
{
    cout << "Neuer Betrag: ";
    cin >> Betrag;
    if(Betrag<=0)
        throw (string)"Betrag";
    objekt->set_Betrag(Betrag);
}

cout << "Artikel ge\204ndert." << endl;

}
void ausgabe() // Alle Artikel mit Gesamtpreis ausgeben
{
float gesamtbetrag=0;
Artikel *objekt;
int i=0;
int j=0;
float gesamtbetrag1=0;
int nr=0;
string a[8];
int b[12];
int c[100];
string tmp;
float bb;

cout<<"Monat\t Kategorie\t\t\t Betrag\t Rechnungsnummer"<<endl;
for(objekt=liste.begin();objekt!=0;objekt=objekt->next())
{
    if(objekt=liste.begin())
    {
    b[0]=objekt->get_Monat();
    a[0]=objekt->get_Kategori();
    c[0]=objekt->get_Betrag();
    }
    else
    {
        break;
    }
    if(objekt!=liste.begin())
    {

        for(i=0;i<12;i++)
        {
            if(objekt->get_Monat()==b[i])
            {

            }
            else{
                b[objekt->get_Monat()-1]==objekt->get_Monat();
                a[0]=get_Kategorie();
                c[0]=get_Betrag();
                for(j=0;j<8;j++)
                    {
                        a[j]=objekt->get_Kategorie();
                        if(objekt->get_Kategorie()==a[j])
                        {

                        }else{}
                                                }
                                }
        }
        }
        else
            {
                b[i+1]=objekt->get_Monat();

            }
    }

    }







    for(j=0;j<8;j++)
    {
        a[j]=objekt->get_Kategorie();
        for(c=0;c<100;c++)
        {
            c[j]=objekt->get_Betrag();
        }

    }

    }







    cout<<"\t\t\t\t\t"<<objekt->get_Betrag()<<"Euro"<<endl;
    gesamtbetrag+=objekt->get_Betrag();
    nr++;
}
if(nr>=2)
{
    cout<<"--------------------------------------------------------------"<<endl;
    cout<<"Gesamtbetrag:  "<<"\t\t\t\t"<<gesamtbetrag<<"Euro"<<endl;
}

}
/*void ausgabe2()//Rechnunslistesbetrag zusammenausgeben
{
string Kategorie;
float Betrag;
int Monat;
float gesamtbetrag2=0;
Artikel *objekt;
Artikel *tmpArtikel;
tmpArtikel=liste.finde(Kategorie);
for(objekt=liste.begin();objekt!=0;objekt=objekt->next())
{
if(tmpArtikel==0)
{
cout<<"\t"<get_Kategorie()<<": "<get_Betrag()<<"Euro."<<endl;

    }
    else
    {
        gesamtbetrag2+=objekt->get_Betrag()+tmpArtikel->get_Betrag();
        cout<<"\t"<<objekt->get_Kategorie()<<": "<<gesamtbetrag2<<"Euro."<<endl;
    }
}

}*/
void loeschen() // Artikel löschen
{
int Monat;
float Betrag;
string Kategorie;
int nr=1,auswahl;
Artikel *objekt;

cout<<"Monat\t Kategorie\t Betrag\t"<<endl;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
    cout << "[" << nr << "]\t";
    objekt->datenausgeben();
    cout << endl;
    nr++;
}

cout << "Welcher Artikel soll geloescht werden?" << endl << "Nummer eingeben: ";
do
{
    cin >> auswahl;
}while(auswahl <= 0 || auswahl >= nr);

nr = 1;
for (objekt=liste.begin(); objekt != 0; objekt = objekt->next())
{
    if(auswahl==nr)
        break;
    nr++;
}
liste.remove(objekt->get_Monat());
cout << "Artikel geloescht." << endl;

}
void leeren()// Einkaufsliste leeren
{
while(!liste.empty())
liste.clear();
cout << endl << "Rechnungslist ist leer!" << endl;
}

int main()
{
int auswahl = 1;
Artikel *tmpObjekt = NULL;
Rechnungsliste list;
do
{
system("cls");
cout<<"---- Rechnungsliste ----"< cout cout cout cout cout cout cout cout cin>>auswahl;
cout<<endl<<endl;
try
{
switch(auswahl)
{
case 0: //End

                cout << "Auf Wiedersehen!" << endl;
                break;
            case 1://Rechnung hinzuguegen
                system("cls");
                erfassen();
                system("pause");
                break;
            case 2://Rechnungsliste Ausgabe
                if(liste.begin()!=0)
                {
                    system("cls");
                    ausgabe();
                }
                else
                    cout<<"List ist leer."<<endl;
                system("pause");
                break;
            case 3://Rechnunslistesbetrag zusammenausgeben
                if(liste.begin()!=0)
                {
                    system("cls");
                    void display_by_month();
                }
                else
                    cout<<"List ist leer."<<endl;
                system("pause");
                break;
            case 4://Daten von Rechnunsliste aendern
                if(liste.begin()!=0)
                {
                    system("cls");
                    void aendern();
                }
                else
                    cout << "Liste ist leer." << endl;
                system("pause");
                break;
            case 5://Rechnungslist loeschen
                if(liste.begin()!=0)
                    {
                        system("cls");
                        void loeschen();
                    }
                else
                    cout<<"List ist leer."<<endl;
                system("pause");
                break;
            case 6://Rechnungslist leeren
                if(liste.begin()!=0)
                {
                    system("cls");
                    void leeren();
                }
                else
                    cout << "Liste ist leer." << endl;
                system("pause");
                break;
            default:
                cout<<"Falsche auswahl."<<endl;
                system("pause");
                break;

        }
    }
    catch(string msg)
    {
        cout << msg << " darf nicht negativ oder Null sein!" << endl << "Vorgang abgebrochen." << endl;
        system("pause");
    }




}while(auswahl!=0);
system("pause");
return 0;

}

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2019-12-18 00:34
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退