链表插入问题

Linked List insertion issue

本文关键字:问题 插入 链表      更新时间:2023-10-16

我正在尝试链表,我的insertNode1函数有点问题。该功能假定在用户输入的节点之后插入一个新节点。结果并没有显示出我想要显示的内容。我希望数字5在3之后,但它没有显示出我想要的样子。

#include <iostream>
using namespace std;
class List {
    struct node {
        float data;
        node* next;
    };
    node* head;
public:
    void appendNode(float);
    void insertNode(float);
    void insertNode1(float,float);
    void deleteNode(float);
    void displayList();
    List(){
        head = NULL;
    }
    ~List(){
        node *nodePtr, *nextNode;
        nodePtr = head;
        while (nodePtr != NULL){
        nextNode = nodePtr->next;
        delete nodePtr;
        nodePtr = nextNode; 
        }
    }
};

void List::appendNode(float d)
{
    node *newNode, *nodePtr;
    newNode = new node; 
    newNode->data = d;
    newNode->next = NULL;
    if (!head){
        head = newNode;
    }
    else {
        nodePtr = head;
        while (nodePtr->next){
            nodePtr = nodePtr->next;
        }
        nodePtr->next = newNode;
    }
}
void List::insertNode(float d){
    node *newNode, *nodePtr, *prevNode=NULL;
    newNode = new node;
    newNode->data = d;
    if (head== NULL)
    {
        head = newNode;
        newNode->next = NULL;
    }
    else {
        nodePtr = head;
        while (nodePtr != NULL && nodePtr->data < d){
            prevNode = nodePtr;
            nodePtr = nodePtr->next;
        }
        if (prevNode == NULL){
            head = newNode;
            newNode->next = nodePtr;
        }
        else {
            prevNode->next = newNode;
            newNode->next = nodePtr;
        }
    }
}
void List::insertNode1(float p, float d){
    node *newNode, *nodePtr, *selectedNode=NULL;
    newNode = new node;
    newNode->data = d;
    nodePtr = head;
    selectedNode = nodePtr;
    selectedNode->data = p;
    if (head != NULL){
        head = newNode;
        newNode->next = NULL;
    }
    else {
        while (nodePtr->next != NULL && nodePtr->data != p){
            nodePtr = nodePtr->next;
        }
        if (selectedNode == NULL){
            head = newNode;
            selectedNode->next = NULL;
        }
        else {
            selectedNode->next = newNode;
        }
    }
}
void List::deleteNode(float da){
    node *nodePtr, *previousNode=NULL;
    if (head == NULL){
        return;
    }
    if (head ->data == da){
        nodePtr = head->next;
        delete head;
        head = nodePtr;
    }
    else{
        nodePtr = head;
        while (nodePtr != NULL && nodePtr->data != da){
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }
        previousNode->next = nodePtr->next;
        delete nodePtr;
    }
}
void List::displayList(){
    node *nodePtr;
    nodePtr = head;
    while (nodePtr!= NULL){
        cout << nodePtr->data << endl;
        nodePtr = nodePtr->next;
    }
}

int main(){
    List lobj;
    lobj.appendNode(3);
    lobj.appendNode(6.4);
    lobj.appendNode(4.5);
    lobj.appendNode(7.8);
    lobj.insertNode(1.5);
    lobj.displayList();
    cout << "after deleting and adding a new node" << endl;
    lobj.deleteNode(6.4);
    lobj.displayList();
    lobj.insertNode1(3, 5);
    lobj.displayList();
    system("pause");
}

void List::insertNode1(float p, float d)函数的开头:

nodePtr = head;
selectedNode = nodePtr;
selectedNode->data = p;

这里,selectedNode指向列表的head,您似乎用p的值覆盖了该节点的数据,我忍不住觉得这不是您想要做的。

List::insertNode1内部存在一些问题。

nodePtr = head;
selectedNode = nodePtr;
selectedNode->data = p;

此处selectedNode指向head,但随后将第一个数据值设置为p。

if (head != NULL){
    head = newNode;
    newNode->next = NULL;
}

此部分仅在head不为空时执行。这意味着每次运行时都会删除整个列表。这就是为什么对list::displayList的最后一次调用只打印5的原因。

if (selectedNode == NULL){
    head = newNode;
    selectedNode->next = NULL;
}

这里selectedNodeNULL。首先,您将head设置为一个新节点,但这不会更改selectedNode。如果你在一个空列表上运行这个方法,你的程序会在这里出错。您应该在此处将headnewNode中的下一个设置为NULL,而不是selectedNode

else {
    selectedNode->next = newNode;
}

这里CCD_ 18仍然指向CCD_。您可以更改nodePtr,但这不会同时更改selectedNode