我正在开发一个通用链表。虽然编译器在运行程序时没有给出任何错误,但它只是崩溃了。我无法弄清楚什么是错的但是因为我在main
中尝试列表的插入方法,问题就在那里。这是 List.h
#include<cstdlib>
enum Error_code
{
success,
overflow,
underflow,
range_error
};
template<class Node_entry>
struct Node
{
Node_entry entry;
Node<Node_entry> *next;
Node()
{
next=NULL;
}
Node(Node_entry item, Node<Node_entry> *add_on=NULL)
{
entry=item;
next=add_on;
}
};
template<class List_entry>
class List
{
public:
List()
{
count=0;
head=NULL;
}
Error_code insert(int position, const List_entry &x)
{
if(position<0 || position>count)
return range_error;
Node<List_entry> *previous, *following, *new_node;
if(position>0) {
previous=set_position(position-1);
following=previous->next;
} else {
following=head;
}
new_node = new Node<List_entry>(x, following);
if(new_node==NULL)
return overflow;
if(position==0)
head=new_node;
else
previous->next=new_node;
count++;
return success;
}
Error_code remove(int position, List_entry &x)
{
if(position<0 || position>count)
return overflow;
Node<List_entry> *old_node, *previous;
if(position==0)
old_node=head;
else {
previous=set_position(position-1);
old_node=previous->next;
}
if(old_node==NULL)
return underflow;
if(position==0) {
head=old_node->next;
delete old_node;
} else {
previous->next=old_node->next;
delete old_node;
}
count--;
return success;
}
bool empty() const
{
return count==0;
}
~List()
{
Node<List_entry> *temp_node=head->next;
while(!empty()) {
delete head;
head=temp_node;
temp_node=head->next;
}
}
protected:
int count;
Node<List_entry> *head;
Node<List_entry> *set_position(int position)const
{
Node<List_entry> *q=head;
for(int i=0;i<count;i++)
q=q->next;
return q;
}
};
的main.cpp
#include <iostream>
#include"List.h"
using namespace std;
int main()
{
int i;
List<int> the_list;
the_list.insert(1, 2);
}
P.S我刚刚学习基础知识,而不是从事大规模设计模块和实践。此时,这只需要工作。
答案 0 :(得分:4)
在构造函数中将头设置为NULL,但不要在任何函数中检查null。在set_position中,你盲目地尝试迭代头部和伴随节点,而不验证它们是否确实存在。
答案 1 :(得分:1)
只是要添加其他答案 - set_position
方法有错误,它使用count
代替position
。
答案 2 :(得分:1)
您的main
功能会发生什么:
insert
,range_error
因position>count
而失败。如果您选择返回错误代码,则应始终检查它们。head
取消引用时,NULL
为Node<List_entry> *temp_node=head->next;
会导致此段错误