如何修复在cpp中打印未知符号



我正在尝试打印一个排序列表,它看起来列表本身是正确的-通过打印内部结果,但当我尝试打印整个列表时,它会显示一些奇怪的符号并崩溃。我哪里错了?这是我在";应用":

#include <iostream>
#include "sortedList.h"
#include "dummy.h"
string getLen(string str)
{
return std::to_string(str.length());
}
int main() {
std::cout << "Hello, World!" << std::endl;
LinkedList <string> myList;
myList.insert("yosi");
myList.insert("Rikki");
myList.insert("Pavel <3");
cout << "Now printing myList" << endl;
myList.print();
LinkedList<string> new_list;
new_list = myList.apply(myList, getLen);
cout << "Now printing new_list" << endl;
new_list.print();
return 0;
}

这是我的h文件:

#include <iostream>
#include <cstring>
#include <string>
#include <functional>
#include "dummy.h"
using namespace std;
#ifndef SORT_H
#define SORT_H
template <class T>
class LinkedList {
struct Node {
Node(const T &in) : data(in) {}
T data;
Node * next;
};
class Iterator
{
Node *m_ptr;              // pointer to current node in the list
public:
Iterator(Node * node) {
m_ptr = node;
}
Iterator& operator ++ () {
m_ptr = m_ptr -> next();
return *this;
}
Iterator operator ++ (T) {
Iterator temp(*this);
m_ptr = m_ptr -> next();
return temp;
}
bool operator == (const Iterator other) const {
return m_ptr == other.m_ptr;
}
bool operator != (const Iterator other) const {
return m_ptr != other.m_ptr;
}
T& operator * () {
return m_ptr -> data();
}
operator bool() {
return m_ptr != 0;
}
};
Node * head;
bool is_in_list(T value){
Node * curr = head;
while(curr != nullptr) {
if (curr->data == value){
return true;
} else {
curr = curr->next;
}
}
return false;
}

public:
LinkedList() {
head = nullptr;
}
LinkedList(T value) {
head = new Node(value);
//        head -> data = value;
//        head -> next = nullptr;
}
~LinkedList() {
while(head != nullptr) {
Node * curr = head -> next;
delete head;
head = curr;
}
}
void operator = (T &t) {
head = t.head;
}
Node * nodeCopy(Node * head) {
if (head == nullptr) {
return nullptr;
}
Node * copied_node = new Node(head -> data);
copied_node -> data = head -> data;
copied_node -> next = nodeCopy(head -> next);
return copied_node;
}
LinkedList(LinkedList &list){
head = nodeCopy(list.head);
}

template<typename B>
LinkedList filter(LinkedList &list, B pred) {
LinkedList <T> new_list(list);
Node * curr = list.head;
while (curr) {
if (!(pred(curr -> data))) {
new_list.remove(curr -> data);
}
curr = curr -> next;
}
std::cout << "Getting out of filter" << std::endl;
return new_list;
}
template<typename A>
LinkedList apply(LinkedList &list, A func) {
LinkedList <T> new_list;
Node * curr = list.head;
while (curr) {
new_list.insert(func(curr -> data));
std::cout << "Putting into new list: " << func(curr -> data) << std::endl;
curr = curr -> next;
}
std::cout << "Getting out of apply" << std::endl;
return new_list;
}
int length() {
//        std::cout << "DEBUG length 1" << std::endl;
int counter = 0;
Node * tmp = head;
//        std::cout << "DEBUG length 2" << std::endl;
while( tmp != nullptr ) {
//            std::cout << "DEBUG length 3" << std::endl;
counter++;
tmp = tmp -> next;
}
return counter;
}
void insert(T value) {
// Add first node
if (head == nullptr) {
std::cout << "Add first node" << std::endl;
head = new Node(value);
head->next = nullptr;
return;
}
Node *curr = head;
// check if should be new head (when new value smaller than current head) -> add new head
if (value <= head->data) {
// add new head
std::cout << "add new head" << std::endl;
Node * new_head = new Node(value);
new_head -> next = head;
head = new_head;
return;
}
while (curr != nullptr) {
if (curr->next == nullptr && value >= curr->data) {
// add new tail
std::cout << "add new tail" << std::endl;
Node * new_node = new Node(value);
curr -> next = new_node;
new_node -> next = nullptr;
return;
} else if (value >= curr->data && value <= curr->next->data) {
// add new node between those two
std::cout << "add new node between those two" << std::endl;
Node * new_node = new Node(value);
Node * temp_ptr = curr -> next;
curr -> next = new_node;
new_node -> next = temp_ptr;
return;
} else {
curr = curr->next;
}
}
}
void remove(T value) {
// TODO: Check if delete all accurancies
if (!is_in_list(value)){
return;
}
// handle the head
if (head->data == value) {
if (head->next != nullptr) {
// head is not single node
Node * temp_ptr = head->next;
delete head;
head = temp_ptr;
return;
} else {
// head is single node
delete head;
head = nullptr;
return;
}
}
Node * curr = head;
Node * prev = head;
while (curr != nullptr){
if (curr -> data == value){
// as we are already handled the head case,
// at this point we know that curr != head.
prev->next = curr->next;
delete curr;
return;
} else {
prev=curr;
curr=curr->next;
}
}
}
void print() {
Node * curr = head;
while (curr != nullptr) {
cout << curr -> data << endl;
curr = curr -> next;
}
}
Iterator begin() {
return head;
}
Iterator end() {
return Iterator(nullptr);
}
};

#endif

这就是运行后的日志:

C:UsersUserCLionProjectsex2.2cmake-build-debugexe_name.exe
Hello, World!
Add first node
add new head
add new head
Now printing myList
Pavel <3
Rikki
yosi
Add first node
Putting into new list: 8
add new head
Putting into new list: 5
add new head
Putting into new list: 4
Getting out of apply
Now printing new_list
@sk @sk X☻k B jw                            ░♦k א
≡   א          ☺   ☺   ♥       ?       ♥
☺       ☺   ?               ╨s  אs  ♦    α☼  Jαw                ╨ ☻    א       ☺   ☺       └ k פ☻k ñ☻k
א

@sk     _«‼ó┼0 ☺    ה Γ π ♣☺!     B ! ! !         )☺            !
! !
:«←╧q0 ♀                    ☺
≡Oúv        ≡§k x@«v☺
C
C
                         PW╘wנM╘w
o«←ת¶0    └ k
∩«←→A0T   ┴

♦                       á☼  X   ┴

♦       ■   ☺   £)      á☼  ☺  ┴

♦                       á☼      

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

o«←ת┴0pNז█▲I╓☻▲╔ ☻▲Θ♠☻▲I*☻
⌂»←כA F«v F«v@F«v`F«vאF«váF«v└F«vαF«v G«v G«v@G«v`G«vאG«váG«v└G«vαG«v H«v H«v@
H«v`H«v







r«←חQ1 ♀csmα☺           ♥    ♣ף↓╪§k pמ⌠█
ersUse}«←ט ♀╝↕úGúv    2   ;«←╬S0☻   τ♦
►►►►►►►►►►►►►►►►►►►►►►►►►►
abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ        F
╡
H»←╝§0
╚↑k σ↑k ♀↓k 5↓k G↓k _↓k z↓k ½↓k ┐↓k ▐↓k ∙↓k d→k s→k ף→k ╝→k Γ→k ≡→k ↓←k P←k q▲k ש▲k ╫▲k         ▼k ↨▼k ?▼k Y▼k q▼k ó▼k ╞
▼k ß▼k  ▼k ¶ k * k P k ש k ª k └ k σ k !!k E!k !k n!k ו!k     PROCESSOR_ARCHITEW6432=AMD64 USERDOMAIN_ROAMINGPROFILE=TH
EAMAZINGME LOCALAPPDATA=C:UsersUserAppDataLocal PROCESSOR_LEVEL=6 USERDOMAIN=THEAMAZINGME LOGONSERVER=\THEAMAZINGME
FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer SESSIONNAME=Console ALLUSERSPROFILE=C:ProgramData PROCESSOR_ARCHITECT
URE=x86 PSModulePath=C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules Syste
mDrive=C: OneDrive=C:UsersUserOneDrive AV_APPDATA=C:UsersUserAppDataRoaming APPDATA=C:UsersUserAppDataRoaming
USERNAME=User ProgramFiles(x86)=C:Program Files (x86) CommonProgramFiles=C:Program Files (x86)Common Files Path=C:P
rogram Files (x86)mingw-w64i686-8.1.0-posix-dwarf-rt_v6-rev0mingw32bin;C:Program Files (x86)Common FilesOracleJa
vajavapath;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDO
WSSystem32OpenSSH;C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Program FilesNVIDIA CorporationNVIDIA N
vDLISR;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDOWSSy
stem32OpenSSH;C:TDM-GCC-64bin;C:Program Files (x86)Bitvise SSH Client;C:Program FilesCMakebin;C:Program Files
Gitcmd;C:UsersUserAppDataLocalMicrosoftWindowsApps;C:Modeltech_pe_edu_10.4awin32pe_edu;C:UsersUserAppDataLo
calMicrosoftWindowsApps;C:UsersUserAppDataLocalGitHubDesktopbin FPS_BROWSER_USER_PROFILE_STRING=Default PATHEXT=
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC DriverData=C:WindowsSystem32DriversDriverData OS=Windows_NT On
eDriveConsumer=C:UsersUserOneDrive COMPUTERNAME=THEAMAZINGME PROCESSOR_REVISION=8e09 CommonProgramW6432=C:Program Fi
lesCommon Files ComSpec=C:WINDOWSsystem32cmd.exe ProgramData=C:ProgramData ProgramW6432=C:Program Files HOMEPATH=
UsersUser SystemRoot=C:WINDOWS TEMP=C:UsersUserAppDataLocalTemp PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 S
tepping 9, GenuineIntel HOMEDRIVE=C: USERPROFILE=C:UsersUser TMP=C:UsersUserAppDataLocalTemp CommonProgramFiles(x
86)=C:Program Files (x86)Common Files ProgramFiles=C:Program Files (x86) PUBLIC=C:UsersPublic windir=C:WINDOWS NUM
BER_OF_PROCESSORS=4 IDEA_INITIAL_DIRECTORY=C:UsersUserCLionProjectsex2.2   z«←ןf1∞↕úv☺   ☺   x§k 0→ºv    o«←תT0נן╚uá
ן╚u░ן╚u
o«←תA≡]zw ^zw►^zw0^zw ^zwP^zw@^zwp^zw`^zwא^zwנ^zw
w«←גA0°"k °"k °"k ☺☺                                                  w«←גY0@#k @#k @#k ☺☺
x«←םYט#k ט#k ט#k ☺☺                          o«←תV░ךלt└ךלt╨ךלt כלt כלt@כלt0כלtpכלt`כ
לtPכלt                                                                                        {«←מA♥       ♦   ♥   ♣   ♣
♠       |«←יU0 ♀    └ k }«←טR0n c a l r p c   }«←טSn c a l r p c   {«←מS0 ♫n c a c n _ i p _ t c p         o«←תU ¶┤d
y┤d
z«←ןA0 ♀                    S0  }«←טT0 ►xrk             z«←ןS0 ♀    ☻               S0  f«←ףT0                    D☻
<☻      ►   ☺                       £)
☺   o«←תH░%k ☺
o«←תAנ¶┤nP↨┤n
o«←תAנ¶Σo ¡∩oá¡∩o`¡∩o░¡∩o╨½∩oא½∩oP¡∩o░»Σo
          ?º←├A J








♦   ¼0  ל k ל k 8 k 8 k  0k  └






































































u«←א◄9 ♫↓rk     CC:UsersUserCLionProjectsex2.2
cmake-build-debugexe_name.exe       |«←י[↓rk     t«←בR0 ☼C:UsersUserCLionProjectsex2.2cmake-build-debugexe_name.e
xe        {«←מZ0 ♀╨rk ♦   yosi    í☺ áS0      └ k {«←מU0 ♀°rk ♣   Rikki   └ k └ k ╚rk     {«←מU0 ♀ sk   Pavel <3    
≡rk T0  δ»→▲U0  └ k └ k 8                       נ☺ סU0  └ k └ k 5               @sk     כ☺ ךU0  └ k └ k 4
hsk     ז☺ חU0  └ k └ k





Process finished with exit code -1073741819 (0xC0000005)

此行:

new_list = myList.apply(myList, getLen);

创建一个新的临时链表,然后复制将其分配给new_list

您的副本分配操作员的实现:

void operator = (T &t) {
head = t.head;
}

无法制作正确的副本。它只会使head指向临时文件中的数据。

临时指针随后被删除,您的new_list只是一个悬空指针。

最新更新