当前位置: 首页 > 知识库问答 >
问题:

单链表添加函数-读取访问冲突

南宫保臣
2023-03-14

我试图使用一个单独的节点类和LinkedList类创建一个基本的单链接列表。我几乎不知道自己在做什么,因为我刚刚开始学习C,所以非常感谢您的帮助。

代码的LinkedList部分是独立运行的,但我相信也有一些需要修改的地方。我的主要问题是,当试图添加到链接列表时,我得到(在LinkedList.h的第64行):

引发异常:读取访问冲突。这个-

我正在使用Microsoft Visual Studio 2015。代码如下:

LinkedList. h(它是内联的):

#pragma once
#include <iostream>

using namespace std;

class Node
{
private:
    Node *next = NULL;
    int data;



public:
    Node(int newData) {
        data = newData;
        next = NULL;
    }
    Node() {

    }
    ~Node() {
        if(next)
            delete(next);
    }
    Node(int newData, Node newNext) {
        data = newData;
        *next = newNext;
    }
    void setNext(Node newNext) {
        *next = newNext;
    }
    Node getNext() {
        return *next;
    }
    int getData() {
        return data;
    }

};


class LinkedList
{

private:
    Node *head;
    int size;
public:

    LinkedList()
    {
        head = NULL;
        size = 0;
    }

    ~LinkedList()
    {

    }

    void add(int numberToAdd)
    {
        head = new Node(numberToAdd, *head);
        ++size;
    }

    int remove()
    {
        if (size == 0) {
            return 0;
        }
        else {
            *head = (*head).getNext();
            --size;
            return 1;
        }
    }

    int remove(int numberToRemove)
    {
        if (size == 0)
            return 0;
        Node *currentNode = head;
        for (int i = 0; i < size; i++) {
            if ((*currentNode).getData() == numberToRemove) {
                *currentNode = (*currentNode).getNext();
                return 1;
            }
        }
    }

    void print()
    {
        if (size == 0) {
            return;
        }
        else {
            Node currentNode = *head;
            for (int i = 0; i < size; i++) {
                cout << currentNode.getData();
                currentNode = currentNode.getNext();
            }
            cout << endl;
        }
    }

};

列出测试人员。cpp

    // List Tester.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "LinkedList.h"

using namespace std;

int main()
{
    LinkedList myList;
    myList.add(4);
    system("pause");
}

共有2个答案

靳彦
2023-03-14

你的整个实现充满了错误。它应该看起来更像这样:

#pragma once
#include <iostream>

class Node
{
private:
    int data;
    Node *next;

public:
    Node(int newData, Node *newNext = NULL)
        : data(newData), next(newNext)
    {}

    void setNext(Node *newNext) {
        next = newNext;
    }

    Node* getNext() {
        return next;
    }

    int getData() {
        return data;
    }
};

class LinkedList
{
private:
    Node *head;
    int size;

public:
    LinkedList()
        : head(NULL), size(0)
    {
    }

    ~LinkedList()
    {
        Node *currentNode = head;
        while (currentNode)
        {
            Node *nextNode = currentNode->getNext();
            delete currentNode;
            currentNode = nextNode;
        }    
    }

    void add(int numberToAdd)
    {
        head = new Node(numberToAdd, head);
        ++size;
    }

    bool remove()
    {
        Node *currentNode = head;
        if (!currentNode)
            return false;

        head = currentNode->getNext();
        delete currentNode;
        --size;

        return true;
    }

    bool remove(int numberToRemove)
    {
        Node *currentNode = head;
        Node *previousNode = NULL;

        while (currentNode)
        {
            if (currentNode->getData() == numberToRemove)
            {
                if (head == currentNode)
                    head = currentNode->getNext();
                if (previousNode)
                    previousNode->setNext(currentNode->getNext());
                delete currentNode;
                return true;
            }

            previousNode = currentNode;
            currentNode = currentNode->getNext();
        }

        return false;
    }

    void print()
    {
        Node *currentNode = head;
        if (!currentNode) return;
        do
        {
            std::cout << currentNode->getData();
            currentNode = currentNode->getNext();
        }
        while (currentNode);
        std::cout << std::endl;
    }    
};

然后,可以使用std::forward_list类(如果您使用的是C 11或更高版本)对其进行简化:

#pragma once
#include <iostream>
#include <forward_list>
#include <algorithm>

class LinkedList
{
private:
    std::forward_list<int> list;

public:
    void add(int numberToAdd)
    {
        list.push_front(numberToAdd);
    }

    bool remove()
    {
        if (!list.empty())
        {
            list.pop_front();
            return true;
        }
        return false;
    }

    bool remove(int numberToRemove)
    {
        std::forward_list<int>::iterator iter = list.begin();
        std::forward_list<int>::iterator previous = list.before_begin();

        while (iter != list.end())
        {
            if (*iter == numberToRemove)
            {
                list.erase_after(previous);
                return true;
            }

            ++previous;
            ++iter;
        }

        return false;
    }

    void print()
    {
        if (list.empty()) return;
        std::for_each(list.cbegin(), list.cend(), [](int data){ std::cout << data });
        std::cout << std::endl;
    }    
};
许嘉珍
2023-03-14

您正在制作不应出现以下情况的副本:

这是:

Node(int newData, Node newNext) {
    data = newData;
    *next = newNext;
}

应该是:

Node(int newData, Node* newNext) {
    data = newData;
    next = newNext;
}

因为现在:

head = new Node(numberToAdd, *head);

变成这样:

head = new Node(numberToAdd, head);

即使head是空指针,它也会工作。您可能需要相应地调整其他代码。

 类似资料:
  • 我在C中创建了一个链接列表,当将新项目插入列表时,我遇到了访问冲突。 如果从未调用复制构造函数,并且在整个程序执行过程中都使用原始列表,则该列表可以完美地工作。 在按值调用函数outList创建要在其范围内管理的列表的副本后,我在插入方法中遇到错误。 列表维护一个指向活动元素ListElement的光标(指针)。列表包含“gotoNext”和“gotoPrior”等方法。复制构造函数的目标是创建列

  • 19. Remove Nth Node From End of List 问题 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the

  • 我很难在我的单链表程序中完成最后这些功能: 我不太知道如何做这些。这是我的密码 ##################################################################################### StringLinkedList。H 字符串单链表类StringLinkedList{Private://指向列表头部的指针StringNode*h

  • 我有一个关于使用LeetCode的链表添加两个数字的问题。下面是问题本身,我面临的问题,以及我的代码。 给您两个非空链表,表示两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回。 您可以假设这两个数字不包含任何前导零,除了数字0本身。 实例 输入:(2- 问题是它打印出: 当结果出现时,它停止。val为0并调用NullPointerException。我不

  • 在下边这个程序中,数组中的url都将被访问:会发送一个简单的http.Head()请求查看返回值;它的声明如下:func Head(url string) (r *Response, err error) 返回状态码会被打印出来。 示例 15.7 poll_url.go: package main import ( "fmt" "net/http" ) var urls = [