C++ C++;删除链接列表断点错误
嘿,我正在尝试制作一个链表,该链表显示从开始到结束添加元素所需的时间。然后从开头和结尾删除。我有添加和删除的代码,但是当我从列表中删除最后一个元素时,我得到了一个关于内存分配的断点错误。我猜当列表为空时,我需要添加一个故障保护,但我不知道如何做 一些建议将不胜感激,因为我对这一点非常陌生 谢谢 列表类的我的代码:C++ C++;删除链接列表断点错误,c++,linked-list,singly-linked-list,C++,Linked List,Singly Linked List,嘿,我正在尝试制作一个链表,该链表显示从开始到结束添加元素所需的时间。然后从开头和结尾删除。我有添加和删除的代码,但是当我从列表中删除最后一个元素时,我得到了一个关于内存分配的断点错误。我猜当列表为空时,我需要添加一个故障保护,但我不知道如何做 一些建议将不胜感激,因为我对这一点非常陌生 谢谢 列表类的我的代码: class list { public: struct node { int data; struct node* next; } *h
class list
{
public:
struct node {
int data;
struct node* next;
} *head, *tail;
list() :head(NULL), tail(NULL) {} // constructor
~list() {
node* current, * temp;
current = head;
temp = head;
while (current != NULL) {
current = current->next;
delete temp;
temp = current;
}
}
// adding to the end of list
void addToEnd(int n) {
node* newNode = new node;
newNode->data = n;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
return;
}
node* cur = head;
while (cur) {
if (cur->next == NULL) {
cur->next = newNode;
return;
}
cur = cur->next;
}
}
//Add to beginning
void addToBeginning(int n) {
node* newNode = new node;
newNode->data = n;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
return;
}
else {
newNode->next = head;
head = newNode;
}
}
void deleteFromBeginning() {
if (head != NULL) {
node* temp = head->next;
delete head;
head = temp;
}
if (head == NULL) {
cout << "Nothing to delete" << endl;
return;
}
}
void deleteFromEnd() {
node* removeLastNode = head;
if (head == NULL)
return;
if (head->next == NULL) {
delete head;
return;
}
// Find the second last node
node* second_last = head;
while (second_last->next->next != NULL)
second_last = second_last->next;
// Delete last node
delete (second_last->next);
// Change next of second last
second_last->next = NULL;
}
//Display List
void displayList() {
if (head != NULL) {
// This was also triggering an access violation error when I tried to run this after the delete loop
for (node* temp = head; temp != NULL; temp = temp->next) {
cout << temp->data << " ";
}
cout << endl;
}
}
};
int main() {
int data;
list myList;
for (int i = 0; i < 10; i++){
myList.addToBeginning(i);
}
myList.displayList();
for (int i = 0; i < 5; i++) {
myList.deleteFromBeginning();
}
myList.displayList();
for (int i = 0; i < 10; i++) {
myList.addToEnd(i);
}
myList.displayList();
for (int i = 0; i < 15; i++) {
myList.deleteFromEnd(); // Error comes here
}
}
类列表
{
公众:
结构节点{
int数据;
结构节点*下一步;
}*头,*尾;
list():head(NULL),tail(NULL){}//构造函数
~list(){
节点*电流,*温度;
电流=水头;
温度=水头;
while(当前!=NULL){
当前=当前->下一步;
删除临时文件;
温度=电流;
}
}
//添加到列表的末尾
无效地址结束(整数n){
node*newNode=新节点;
newNode->data=n;
newNode->next=NULL;
if(head==NULL){
头=新节点;
返回;
}
节点*cur=头部;
while(cur){
如果(当前->下一步==NULL){
cur->next=newNode;
返回;
}
cur=cur->next;
}
}
//添加到开头
void addToBeginning(内部编号){
node*newNode=新节点;
newNode->data=n;
newNode->next=NULL;
if(head==NULL){
头=新节点;
返回;
}
否则{
新建节点->下一步=头部;
头=新节点;
}
}
void deleteFromStart(){
if(head!=NULL){
节点*temp=head->next;
删除标题;
压头=温度;
}
if(head==NULL){
cout next->next!=NULL)
second\u last=second\u last->next;
//删除最后一个节点
删除(倒数第二次->下一次);
//更改倒数第二的下一个
second_last->next=NULL;
}
//显示列表
void displayList(){
if(head!=NULL){
//当我尝试在删除循环后运行此操作时,这也触发了访问冲突错误
对于(节点*temp=head;temp!=NULL;temp=temp->next){
cout data必须检查列表中是否有多个项,然后启动while循环。当我只剩下1个节点时,它导致了一个问题
void deleteFromEnd() {
node* temp;
if (head == NULL)
{
cout << " There is no item to delete!" << endl;
return;
}
node* start = head;
if (start->next != NULL)
{
while ((start->next)->next != NULL)
{
start = start->next;
}
temp = start->next;
start->next = NULL;
}
else
{
temp = start;
head = NULL;
}
delete temp;
}
void deleteFromEnd(){
节点*温度;
if(head==NULL)
{
cout next)->next!=NULL)
{
开始=开始->下一步;
}
温度=开始->下一步;
开始->下一步=空;
}
其他的
{
温度=启动;
head=NULL;
}
删除临时文件;
}
“断点错误”-没有这类错误。您可能是指您在调试器中运行此程序,并且调试器在出现严重错误(可能是崩溃)时中断了执行检测到。各位,好消息!由于您正在使用调试器,因此可以检查变量的值以更好地了解出错的原因。请使用较小的调试器。您怀疑删除最后一个元素有问题。因此,请将main
函数向下修剪,将单个元素添加到列表中,然后删除该元素。如果崩溃仍然存在,请删除不需要的所有代码,以支持此更简单的main()
。异常:在将其从示例中删除之前,您可能需要查看deleteFromStart()
。您可以在该函数中执行deleteFromEnd()中缺少的一些操作
。我已经把它删减了,可能我还没有完全理解这里的指针是如何工作的。这是我仍然收到的消息:抛出异常:读取访问冲突。倒数第二个->下一个是nullptr。没关系,我已经解决了。我必须检查列表中是否有多个项目,然后启动while循环。您的修复看起来不错,但您的肛门没有问题ysis已关闭。如果列表只有一个项,则问题中此函数的版本也会跳过循环,通过行if(head->next==NULL)
。因此更改不是固定的。此答案的关键改进是,在删除列表中的最后一项时更新head
(通过分配head=NULL
)。