C++ 努力让这个push_back()函数工作

C++ 努力让这个push_back()函数工作,c++,class,linked-list,C++,Class,Linked List,我正在为我的大学课堂做一项作业,我正在努力弄清楚为什么我的push_front()函数的代码能够正常工作,但我的push_back()总是给出: “引发异常:读取访问冲突。st为空ptr。” struct NodeDate { int日、月、年;//结构的数据 struct NodeDate*nextNode;//指向下一个节点的指针 }*开始//不确定我们为什么这样做,但所有的例子都包含它 类LinkedListDate { 公众: //成员函数的原型 NodeDate*创建_节点(NodeD

我正在为我的大学课堂做一项作业,我正在努力弄清楚为什么我的push_front()函数的代码能够正常工作,但我的push_back()总是给出:

“引发异常:读取访问冲突。st为空ptr。”

struct NodeDate
{
int日、月、年;//结构的数据
struct NodeDate*nextNode;//指向下一个节点的指针
}*开始//不确定我们为什么这样做,但所有的例子都包含它
类LinkedListDate
{
公众:
//成员函数的原型
NodeDate*创建_节点(NodeDate);
void push_front();
void pop_front();
无效删除_-front();
无效搜索();
void display();
LinkedListDate();
无效推回();
void remove_back();
void pop_back();
};
LinkedListDate::LinkedListDate()
{
start=NULL;//我们创建的第一个指针将设置为NULL
}
NodeDate*LinkedListDate::create_node(struct NodeDate newDate)//创建新节点并返回所述节点的函数
{
结构NodeDate*tempNode,*s;
tempNode=new(struct NodeDate);//为我们的temp节点保留内存
if(tempNode==NULL)//如果节点为空
{
std::cout month=newDate.month;
tempNode->year=newDate.year;
tempNode->nextNode=NULL;//记住这些都是日期结构中包含的值
return tempNode;//返回节点
}
}
void LinkedListDate::push_front()//将在linkedlist开头插入节点的函数
{
结构NodeDate*tempNode,*st,newNode;
std::cout>newNode.day;
std::cout>newNode.month;
std::cout>newNode.year;
tempNode=create_node(newNode);//使用create_node函数为日期创建新节点
if(start==NULL)//检查起始(Head)节点是否为NULL,然后检查要插入的第一个节点
{
start=tempNode;//start节点指向我们的临时节点
start->nextNode=NULL;//为start->next分配NULL
}
else//else节点已在列表中可用
{
st=start;//将start分配给st
start=tempNode;//指向临时节点的起点
start->nextNode=st;//开始st的下一个点
}
std::cout newNode.month;
std::cout>newNode.year;
tempNode=create_node(newNode);//使用create_node函数为日期创建新节点
st=启动;
while(st->nextNode!=NULL)//移动直到到达列表的末尾
{
st=st->nextNode;//移动到下一个节点
}
tempNode->nextNode=NULL;//将NULL分配给下一个临时节点
st->nextNode=tempNode;//st next指向临时节点
标准::cout
也一样

struct NodeDate
{
//...
};
NodeDate *start;
当列表为空(即开始为空)时,push_back将失败

void LinkedListDate::push_back()
{
//...
tempNode=创建_节点(newNode);
tempNode->nextNode=nullptr;
if(start==nullptr)
{
开始=临时节点;
}
其他的
{
st=启动;
while(st->nextNode!=nullptr)//移动直到到达列表的末尾
{
st=st->nextNode;//移动到下一个节点
}
st->nextNode=tempNode;
}

STD::如果代码>开始/代码>是空的,你会怎么办?考虑一下A,这样我们就可以看到你正在做的事情了。你也可以考虑在调试器中进行跟踪,这样你就可以准确地看到它出错的地方。我也建议把输入处理代码移到一个函数中,这样你就不会在多个地方复制/粘贴。<代码>ush_back
没有“空列表”在这里,有一些C习惯用法:在C++中,<代码>新< /COD>不返回代码>空<代码>如果分配失败,它会引发异常。因此,检查<代码> null <代码>是没有用的。在现代C++中,你会说“代码> null ptr< /COD>而不是<代码> null <代码>。你不需要限定一个类型。每次都使用
struct
。只需说
tempNode=new NodeDate;
。它不仅保留内存(如
malloc()
),而且还初始化它(如果您有构造函数)。最后,
new
不是一个函数。它是一个运算符。您不需要括号。
struct NodeDate
{
//...
}*start;
struct NodeDate
{
//...
};
NodeDate *start;
void LinkedListDate::push_back()
{
    //...
    tempNode = create_node(newNode);
    tempNode->nextNode = nullptr;
    if(start == nullptr)
    {
        start = tempNode;
    }
    else
    {
        st = start;
        while (st->nextNode != nullptr) //Move til we reach end of the list
        {
            st = st->nextNode; //Move to the next node
        }
        st->nextNode = tempNode;
    }
    std::cout << "Element Inserted at last" << std::endl;
}