C++ 在C+中打印或遍历链表+;
我想打印出我刚刚制作的链表。 我已经知道如何打印出第一个和最后一个元素,但想不出打印整个列表的方法 我需要从第一个元素移动到下一个元素 最后需要一个停止的条件 但我并没有在这上面实现迭代器。 仅使用指针和节点可以打印整个列表吗C++ 在C+中打印或遍历链表+;,c++,pointers,linked-list,graph-theory,traversal,C++,Pointers,Linked List,Graph Theory,Traversal,我想打印出我刚刚制作的链表。 我已经知道如何打印出第一个和最后一个元素,但想不出打印整个列表的方法 我需要从第一个元素移动到下一个元素 最后需要一个停止的条件 但我并没有在这上面实现迭代器。 仅使用指针和节点可以打印整个列表吗 int main () { LinkedList name_list; name_list.TraPrinhead(name_list); } void LinkedList::TraPrinHead(const LinkedList& p) { co
int main ()
{ LinkedList name_list;
name_list.TraPrinhead(name_list); }
void LinkedList::TraPrinHead(const LinkedList& p)
{
cout << "The First Element of this List is : ";
cout << header->next->elem; // print out the first element
cout << endl;
cout << "The Last Element of this List is : ";
cout << tail->prev->elem; // print out the first element
cout << endl;
cout << "Now the whole list.......";
cout << ??????????????????????
}
class LinkedList {
public: class Nodes { // Doubly Linked List Node
public:
Nodes(const string& e);
void ToNodeValue(const string& e);
string getElemValue() const;
void printNodeValue();
private:
string elem; // node element value
Nodes* prev; // previous node in list
Nodes* next; // next node in list
// pointer that points to current node is this pointer
public:
void ConnectSingly(Nodes* a, Nodes* b);
void ConnectDoubly(Nodes* a, Nodes* b);
friend class LinkedList;
};
public:
LinkedList();
virtual ~LinkedList();
bool empty() const;
const string& getFirst() const;
const string& getLast() const;
void addtoFront(const string& e);
void addtoBack(const string& e);
void TraPrinHead(const LinkedList& p);
private:
Nodes* header;
Nodes* tail;
protected:
void InsertDoublyBefore(Nodes* d, const string& e);
void InsertDoublyAfter(Nodes* d, const string& e);
friend class Nodes;
};
void LinkedList::InsertDoublyBefore(Nodes* d, const string& e) {
if (header->next == tail)
{ // header->next->elem = e;
Nodes* n = new Nodes;
n->elem = e;
n->next = tail;
n->prev = tail->prev;
tail->prev->next = tail->prev = n;
header->next = n;
}
else
{
Nodes* n = new Nodes;
n->elem = e;
n->next = d;
n->prev = d->prev;
d->prev->next = d->prev = n;
}
}
void LinkedList::InsertDoublyAfter(Nodes* d, const string& e)
{
InsertDoublyBefore(d->next, e);
}
void LinkedList::addtoFront(const string& e) { InsertDoublyBefore(header->next, e); }
void LinkedList::addtoBack(const string& e) { InsertDoublyBefore(tail, e); }
void LinkedList::Nodes::ConnectSingly(Nodes* a, Nodes* b)
{
a->next = b; // a's next pointer points to b
}
void LinkedList::Nodes::ConnectDoubly(Nodes* a, Nodes* b)
{
a->next = b; // a's next pointer points to b
b->prev = a; // b's prev pointer points to a
}
int main()
{LinkedList name_列表;
名称列表。TraPrinhead(名称列表);}
void LinkedList::TraPrinHead(const LinkedList&p)
{
cout elem;//打印出第一个元素
cout elem=e;
n->next=尾部;
n->prev=尾部->prev;
尾部->上一个->下一个=尾部->上一个=n;
标题->下一步=n;
}
其他的
{
节点*n=新节点;
n->elem=e;
n->next=d;
n->prev=d->prev;
d->prev->next=d->prev=n;
}
}
void LinkedList::InsertDoublyAfter(节点*d、常量字符串&e)
{
InsertDoublyBefore(d->next,e);
}
void LinkedList::addtoFront(const string&e){InsertDoublyBefore(header->next,e);}
void LinkedList::addtoBack(const string&e){InsertDoublyBefore(tail,e);}
void LinkedList::Nodes::ConnectSingly(节点*a,节点*b)
{
a->next=b;//a的下一个指针指向b
}
void LinkedList::Nodes::ConnectDoubly(节点*a,节点*b)
{
a->next=b;//a的下一个指针指向b
b->prev=a;//b的prev指针指向a
}
节点*p=myList.head;
while(p){
std::cout elem next;
}
它如您所期望的那样,继续转到下一个元素,直到它为NULL(到达末尾)
编译器将NULL更改为0,并且0==false
你应该看看你的课堂讲稿,因为我已经为你回答了一个关于这门课的问题
此外,我认为,一般来说,尾部指向最后一个元素,而不是一个过去的元素。
所以打印最后一个元素应该是
cout << tail->elem; // print out the first element
cout elem;//打印出第一个元素
除非讲师另有规定。
显然,您需要为这些变量中的大多数创建“getter”函数,因为它们被声明为私有的。链表的全部要点是您可以使用一个元素访问下一个元素。因此,您只需要使用指针遍历列表
Nodes* currentNodes = header->next; //pointer used to iterate through list; initially points at first element of list
while(currentNodes != tail) { //condition to stop
cout << currentNodes->elem << endl;
currentNodes = currentNodes->next;
}
Nodes*currentNodes=header->next//用于遍历列表的指针;最初指向列表的第一个元素
while(currentNodes!=tail){//要停止的条件
下一步;
}
非常感谢!!!!!非常感谢!!!!!非常感谢!!!!!非常感谢!!!!!你们这些家伙救了我的命,我可以为这个做无限循环。有没有办法在最后停下来?非常感谢!!!!!非常感谢!!!!!非常感谢!!!!!非常感谢!!!!!你们救了我的命,我得到了无限循环。有没有办法在末尾停止?当p==tail时,p->next==NULL。到时它就会停止。当p指向NULL时,它将停止。正如我所说,因为NULL==0==false,所以我会仔细检查您的插入函数。并确保将tail->next保持为NULL,每当您在末尾添加一个元素(在tail之后)谢谢,我发布了我的插入函数。。。。
Nodes* currentNodes = header->next; //pointer used to iterate through list; initially points at first element of list
while(currentNodes != tail) { //condition to stop
cout << currentNodes->elem << endl;
currentNodes = currentNodes->next;
}