C++ 类似于市场交易或交易程序c++;

C++ 类似于市场交易或交易程序c++;,c++,C++,我试图完成我的程序已经有一段时间了,我已经到了所有东西都可以编译但立即崩溃的部分。我的任务是制作一个类似的CD交换程序,在这个程序中,人们可能会要求特定的CD或在特定的CD上出价,从文件中读取信息,分离如下所示: 时间动作个人识别码CDname(例如:100 A 11111111 ACDC),其中 所有信息都已从文件中放入和读取。我对图书馆的使用是有限的。 因此,我的主要任务是从输入文件中读取信息,对列表进行排序,并在A(询问者)和B(投标人)想要相同CD的地方搜索匹配项,并在输出文件中以格式(

我试图完成我的程序已经有一段时间了,我已经到了所有东西都可以编译但立即崩溃的部分。我的任务是制作一个类似的CD交换程序,在这个程序中,人们可能会要求特定的CD或在特定的CD上出价,从文件中读取信息,分离如下所示: 时间动作个人识别码CDname(例如:100 A 11111111 ACDC),其中

所有信息都已从文件中放入和读取。我对图书馆的使用是有限的。 因此,我的主要任务是从输入文件中读取信息,对列表进行排序,并在A(询问者)和B(投标人)想要相同CD的地方搜索匹配项,并在输出文件中以
格式(时间(交易完成时,最新)个人ID(询问者的)个人ID(拜德的))

我的代码是:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>

using namespace std;

class elem
{
public:
    unsigned long int time;
    char action;
    char PIcode[12];
    char CDname[51];
    elem * next;

    elem(unsigned long int, char, char [12],char [51]);

};
elem::elem(unsigned long int time2,char action2, char PIcode2[12],char CDname2[51])
{
    time=time2;
    action=action2;
    strcpy(PIcode,PIcode2);
    strcpy(CDname,CDname2);
    next=NULL;
}
class List{
public:
        List();
        void print();
        bool isempty();
        void insert(unsigned long int time2,char action2, char PIcode2[12],char CDname2[51]);
        elem *first;
        elem *last;
};

void List::insert(unsigned long int time,char action, char PIcode[12],char CDname[51])
{
    elem *newptr=new elem(time,action,PIcode,CDname);

    if(isempty())
    {
        first=last=newptr;
    }
    else
    {
        last->next=newptr;
        last=newptr;
    }
}

}

bool List::isempty()
{
    return (first==NULL);
}

List::List()
{
    first=last=NULL;
}


bool checkCode(elem *iev, elem *iev2)
{
    for(int i=0;i<51;i++)
    {
        if(iev->CDname[i]!=iev2->CDname[i]) return false;
    }

return true;
}


int main()
{
fstream fin("cd_maina.i1",ios::in);
fstream fout("cd_maina.out",ios::out);

    unsigned long int time;
    char action;
    char PIcode[12];
    char CDname[51];

    List queue1;

    bool delete1=0;

    while(fin)
    {
        fin>>time;
        fin>>action;
        fin>>PIcode;
        fin>>CDname;

        queue1.insert(time,action,PIcode,CDname);
    }

    elem *glob=queue1.first;
    elem *cur;
    elem *cur2;

    while(glob!=NULL)
    {
        cur=glob;
        cur2=cur->next;
        delete1=0;

        while(cur2->next!=NULL)
        {

            if( ((cur->action=='A' && cur2->action=='B') || (cur->action=='B' && cur2->action=='A')) && checkCode(cur,cur2) )
            {
                if(cur->action=='A')
                {
                    fout<<cur2->time<<" ";
                    fout<<cur->PIcode<<" ";
                    fout<<cur2->PIcode<<endl;
                }
                else
                {
                    fout<<cur2->time<<" ";
                    fout<<cur2->PIcode<<" ";
                    fout<<cur->PIcode<<endl;
                }

                if(cur==queue1.first)
                {
                    queue1.first=cur->next;
                    glob=queue1.first;
                    delete cur;
                    delete1=1;
                }
                else
                {
                    elem *cur3=queue1.first;
                    while(cur3->next!=cur)
                    {
                        cur3=cur3->next;
                    }
                    if(cur==glob) glob=glob->next;
                    cur3->next=cur->next;
                    delete cur;
                    delete1=1;
                }

                if(cur2==queue1.last)
                {
                    elem *cur4=queue1.first;
                    while(cur4->next!=cur2)
                    {
                        cur4=cur4->next;
                    }
                    cur4->next=0;
                    queue1.last=cur4;
                    break;
                }
                else
                {
                    elem *cur4=queue1.first;
                    while(cur4->next!=cur2)
                    {
                        cur4=cur4->next;
                    }
                    cur4->next=cur2->next;
                    delete cur2;
                    break;
                }
            }

            cur2=cur2->next;
        }

        if(delete1==0) glob=glob->next;
    }

}
#包括
#包括
#包括
#包括
使用名称空间std;
类元素
{
公众:
无符号长整型时间;
炭作用;
半微码[12];
char-CDname[51];
elem*下一步;
elem(无符号长整型,char,char[12],char[51]);
};
elem::elem(无符号长整数时间2,字符action2,字符PIcode2[12],字符CDname2[51])
{
时间=时间2;
行动=行动2;
strcpy(皮码,皮码2);
strcpy(CDname,CDname2);
next=NULL;
}
班级名单{
公众:
List();
作废打印();
bool是空的();
void insert(无符号长整数时间2,字符action2,字符PIcode2[12],字符CDname2[51]);
元素*第一;
元素*最后;
};
void List::insert(无符号长整型时间,字符操作,字符皮码[12],字符CDname[51])
{
elem*newptr=新元素(时间、动作、皮码、CDname);
if(isempty())
{
第一个=最后一个=新PTR;
}
其他的
{
last->next=newptr;
last=newptr;
}
}
}
bool List::isempty()
{
返回(first==NULL);
}
列表::列表()
{
first=last=NULL;
}
布尔校验码(elem*iev,elem*iev2)
{
对于(int i=0;iCDname[i]!=iev2->CDname[i]),返回false;
}
返回true;
}
int main()
{
fstream fin(“cd_maina.i1”,ios::in);
fstream fout(“cd_maina.out”,ios::out);
无符号长整型时间;
炭作用;
半微码[12];
char-CDname[51];
列表1;
bool-delete1=0;
而(财务)
{
fin>>时间;
fin>>行动;
fin>>皮码;
fin>>CDname;
queue1.插入(时间、动作、皮码、CDname);
}
elem*glob=queue1.first;
元素*cur;
元素*cur2;
while(glob!=NULL)
{
cur=glob;
cur2=cur->next;
delete1=0;
while(cur2->next!=NULL)
{
如果((cur->action=='A'&&cur2->action=='B')| |(cur->action=='B'&&cur2->action=='A'))和检查代码(cur,cur2))
{
如果(当前->操作=='A')
{

fout这起撞车事件似乎是由一场车祸引起的

在匹配的情况下,可删除cur:

if(cur==queue1.first) {
    queue1.first=cur->next;
    glob=queue1.first;
    delete cur;
    delete1=1; }
然后,在循环的下一次迭代“while(cur2->next!=NULL)”中,使用cur,即悬空指针

if( ((cur->action=='A' && cur2->action=='B') || (cur->action=='B' && cur2->action=='A')) && checkCode(cur,cur2) )
在此步骤中,cur可能已被删除,并导致故障和崩溃

忠告:

  • 使用delete时,将指针设置为NULL

  • 当使用可以为NULL的指针时,请始终检查它是否为NULL


这是循环的初始部分:

 while( glob != NULL ){
    cur = glob;
    cur2 = cur->next;   // <<<<<<<<<< cur2 is glob->next WHICH CAN BE NULL
    delete1 = 0;

    while(cur2->next != NULL) {       // dereference NULL
while(全局!=NULL){
cur=glob;

cur2=cur->next;//“立即崩溃”--您是否尝试在
main
的第一行设置断点并单步执行以查看崩溃的原因?“立即崩溃”可能不会发生(尽管如果它在某个类构造函数中崩溃是可能的)。请使用调试器,或者在代码中添加
printf(“到达这里!\n”);fflsuh(stdout);
@Jongware确实在我的代码上洒了printf
(“到达这里!\n”);
,打印主函数中的所有内容,然后删除程序已停止工作的错误。现在程序在输入示例上中断,例如
100000 A 010101222 CD1
100001 A 010101222 CD1
100002 A 010101222 CD1
100003 B 111111 222 CD1
100004 A 010101222 CD1
100005 B 12121233333 CD1
100006 B 111111 2222 CD1
其中多个答案是正确的。发现问题是许多相似的CD名,bool checkcode()有问题。
。你必须修改大部分程序。Adam的评论也很有价值。-包含A和B的链接列表不是最佳选择。查看“地图”,一个用于A,一个用于B。可能会有来自不同用户的多个报价。这不是那么简单,但可以通过使用正确的数据结构来简化!
if( ((cur->action=='A' && cur2->action=='B') || (cur->action=='B' && cur2->action=='A')) && checkCode(cur,cur2) )
 while( glob != NULL ){
    cur = glob;
    cur2 = cur->next;   // <<<<<<<<<< cur2 is glob->next WHICH CAN BE NULL
    delete1 = 0;

    while(cur2->next != NULL) {       // dereference NULL