我试图使用一个单独的节点类和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");
}
你的整个实现充满了错误。它应该看起来更像这样:
#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;
}
};
您正在制作不应出现以下情况的副本:
这是:
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 = [