使用数据c ++链表

时间:2016-09-09 04:02:19

标签: c++ pointers linked-list

我有以下代码,我试图为以下场景编写修复:在参数中传递的数字在列表中不存在,因此它没有以前的

此函数应该:接受一个值 它将用于遍历列表以及它找到的数据所在的第一个节点 同样,它将在匹配节点之前返回指向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;
    }
  }

2 个答案:

答案 0 :(得分:3)

你在下面的陈述中犯了一个错误,

  if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data)

如果currentPtr->nextPtrNULL,那么您在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。