我有以下代码,我试图为以下场景编写修复:在参数中传递的数字在列表中不存在,因此它没有以前的
此函数应该:接受一个值 它将用于遍历列表以及它找到的数据所在的第一个节点 同样,它将在匹配节点之前返回指向ListNode的指针。
//return a pointer to the ListNode before the matching node data
template < typename NODETYPE >
ListNode < NODETYPE > * List < NODETYPE >::prevPointerUsingData(NODETYPE &data) {
ListNode < NODETYPE > *previousPtr = NULL;
ListNode < NODETYPE > *currentPtr = firstPtr;
//first node cannot have a previous
if(data == currentPtr->data) {
cout << "canot have a previous node" << endl;
return 0;
}else {
//traverse until you've met the previous' node's data
while (currentPtr->nextPtr != NULL) {
if(currentPtr->nextPtr->data == data){
//previous is assigned the current node
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}else {
currentPtr = currentPtr->nextPtr;
}
}if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) {
cout << "no such node" << endl;
return 0;
}
}
}
如果我输入一个数字(数据),就像我的列表中没有的那样,它会崩溃。某处有逻辑错误吗?
修改
我编写了这个有用的代码,虽然我想添加IF
检查以查看列表是否为空,如果它是返回0.我正在使用此代码并将其应用于上面的代码,只是因为它执行了同样的事情,除了上面的那个使用来自节点的数据,下面使用指针。
这个函数应该:接受指定的int 列表中节点的位置,并在该节点之前返回指向ListNode的指针。
//return pointer to the ListNode before that node
template < typename NODETYPE >
ListNode < NODETYPE > * List < NODETYPE > ::prevPointerUsingPosition(int position) {
ListNode < NODETYPE > * previousPtr = NULL;
ListNode < NODETYPE > * currentPtr = firstPtr;
if(position < 1) {
return 0;
}else if( position > sizeOfList()) {
return 0;
}else {
for(int i = 1; i < position-1; i++) {
currentPtr = currentPtr->nextPtr;
}
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}
}
答案 0 :(得分:3)
你在下面的陈述中犯了一个错误,
if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data)
如果currentPtr->nextPtr
为NULL
,那么您在currentPtr->nextPtr->data != data
条件下取消引用此空指针。
答案 1 :(得分:0)
更改
if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data)
到
if(currentPtr->nextPtr != NULL && currentPtr->nextPtr->data != data)
另外,在第一个firstPtr
语句中取消引用之前,您应该检查if
是否为非null。