我在从链接列表中给出的任意位置删除时遇到问题。我成功获得了我的列表的第一个位置和最后一个位置,但是在进入第n个位置时遇到了运行时错误。
struct node
{
int number;
node *next;
};
struct Box
{
void insertAsFirstElement(node *&head, node *&last,int number);
void insert(node *&head, node *&last,int number);
void remove(node *&head, node *&last);
void showList(node *current);
};
bool isEmpty(node *head) {
return head == NULL;
}
char menu() {
char choice;
cout<<"Menu"<<"1. Add an item.\n"<<"2. Remove an item.\n"<<"3. Show the list.\n"<<"Exit\n";
cin >> choice;
return choice;
}
void insertAsFirstElement(node *&head, node *&last,int number) {
node *temp = new node;
temp->number = number;
temp->next = NULL;
head = temp;
last = temp;
}
void insert(node *&head, node *&last,int number) {
if(isEmpty(head))
insertAsFirstElement(head, last, number);
else {
node *temp = new node;
temp->number = number;
temp->next = NULL;
last->next = temp;
last = temp;
}
}
void remove(node *&head, node *&last,int number) {
cin>>number;
node *temp = new node;
if(isEmpty(head))
cout<< "this list is already empty.\n";
else if (head == last) {
delete head;
head = NULL;
last = NULL;
} else {
for(int i = 0; 1< number-2; i++)
/*node *temp = head;
head = head->next;
delete temp;*/
node *temp = head;
head = head->next;
temp= temp->next;
node* temp2 = temp->next;
temp->next = temp2->next;
delete temp2;
}
}
void showList(node *current) {
if(isEmpty(current))
cout << "The list is empty\n";
else {
cout << "The list contains:\n";
while(current != NULL) {
cout << current->number << endl;
current = current->next;
}
}
}
int main() {
node *head = NULL;
node *last = NULL;
char choice;
int number;
do{
choice = menu();
switch (choice) {
case'1':
cout << "please enter a number: ";
cin >> number;
insert (head,last,number);
break;
case'2':
remove(head,last,number);
break;
case '3':
showList(head);
break;
default:
cout<< "System exit\n";
}
}while (choice !='4');
}
答案 0 :(得分:0)
删除函数中的循环条件是错误的,它不会检查受循环影响的任何内容,因此它会永远运行(或者更有可能,直到它破坏某些东西)。
此外,您的remove
与其签名不匹配。既然你没有真正解释你想要它做什么,很难说如何修复它 - 你要删除的值是number
(如果有多个那么?)它是要删除的索引吗?要删除的元素是什么?
我认为它是第二个,因为它似乎是你想要做的。在任何情况下,您需要在删除之前搜索该项目,而不是 -
for(int i = 0; 1< number-2; i++)
尝试
for(int i = 0; i < number-1; i++)
1可能是一个拼写错误,并且它足以阻止一个元素前进(索引意义取决于你,但如果头部为0,则删除索引2应该运行循环一次)
然后,你需要在循环中放置一些括号,因为现在你只是循环遍历第一行代码。在循环之前移动temp = head
的赋值,您只需要执行一次,然后循环
temp= temp->next;
(如果那是你唯一不需要括号的行,但无论如何这都是一个好习惯)。
这应该会引导您进入索引之前的元素。如果那是头脑,你需要一些特殊的治疗方法,否则不要改变head
,否则你将失去想要保留的元素。
实际删除看起来可能有效,但每次取消引用next
时,都需要确保它不是NULL。