我通过创建一个简单的链表类来刷新我的c ++。我遇到的问题是当我尝试打印列表时,列表的开头没有打印。我怎么能摆脱这个?另外,我的第二个构造函数遇到了问题。我怎么会这样做?“
这是代码 List.h
#ifndef NODE_H
#define NODE_H
class List{
private:
typedef struct Node{
int data;
struct Node* next;
}* node;
node head;
int listLength;
public:
List();
List(int data, node nextLink);
void printList();
void push(int data);
void Delete(int d);
int listSize(void);
};
我的List.cpp
#endif
#include "node.h"
#include <iostream>
using namespace std;
List::List(){
head->data=0;
head->next= NULL;
listLength=0;
}
List::List(int data, node nextLink){
head=NULL;
listLength++;
}
void List::push(int data){
if(head==NULL){
head->data=data;
head->next= NULL;
}
else{
node cursor = head;
while(cursor->next != NULL)
cursor = cursor -> next;
node newNode= new Node;
newNode->data=data;
newNode->next=NULL;
cursor->next= newNode;
}
listLength++;
}
void List::printList(){
node cursor=head;
while(cursor!=NULL){
//if(cursor->data==0){cursor=cursor->next;}
if(cursor->next==NULL){
cout<<cursor->data<<endl;
return;
}
else{
cout<<cursor->data<<" -> ";
cursor=cursor->next;
}
}
cout<<endl;
}
int main(){
List li;
li.push(2);
li.push(3);
li.push(0);
li.push(4);
li.printList();
return 0;
}
答案 0 :(得分:1)
您永远不会初始化您的头节点,因此您将在下面的代码中写入未分配的内存。
if(head==NULL){
head->data=data;
head->next= NULL;
}
应该是:
if(head==NULL){
head = new Node; // added this line
head->data=data;
head->next= NULL;
}
您可能也想要第一个构造函数
List::List(){
head->data=0;
head->next= NULL;
listLength=0;
}
改为
List::List(){
head = NULL;
listLength=0;
}
至于第二个构造函数,我假设你想要这样的东西?
List::List(int data, node nextLink){
head = new Node;
head->data = data;
head->next = nextLink;
listLength = 1;
}
如果没有,你能更好地解释一下你想要的吗?
我还要注意,为Node
结构创建一个初始化next
到NULL
的构造函数通常被认为是一种很好的编程习惯,然后你就不必每次在整个代码中创建new Node
时都会明确设置它。