所以我对C ++很新,今天我决定坐下来了解链接列表是如何工作的。到目前为止,我有很多乐趣,但是当我尝试以相反的顺序打印我的链接列表时遇到了一个问题(不会颠倒链接列表的顺序!)
另外,我想在没有双链表的情况下这样做:
#include <iostream>
#include <string>
using namespace std;
class LinkedList
{
public:
LinkedList()
{
head = NULL;
}
void addItem(string x)
{
if(head == NULL)
{
head = new node();
head->next = NULL;
head->data = x;
} else {
node* temp = head;
while(temp->next != NULL)
temp = temp->next;
node* newNode = new node();
newNode->data = x;
newNode->next = NULL;
temp->next = newNode;
}
}
void printList()
{
node *temp = head;
while(temp->next != NULL)
{
cout << temp->data << endl;
temp = temp->next;
}
cout << temp->data << endl;
}
void addToHead(string x)
{
node *temp = head;
head = new node;
head->next = temp;
head->data = x;
}
int countItems()
{
int count = 1;
for(node* temp = head; temp->next != NULL; temp = temp->next)
++count;
return count;
}
void printReverse()
{
node* temp2;
node* temp = head;
while(temp->next != NULL)
temp = temp->next;
//Print last node before we enter loop
cout << temp->data << endl;
for(double count = countItems() / 2; count != 0; --count)
{
//Set temp2 before temp
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
cout << temp2->data << endl;
//Set temp before temp2
temp = head;
while(temp->next != temp2)
temp = temp->next;
cout << temp->data << endl;
}
cout << "EXIT LOOP" << endl;
}
private:
struct node
{
string data;
node *next;
}
*head;
};
int main()
{
LinkedList names;
names.addItem("This");
names.addItem("is");
names.addItem("a");
names.addItem("test");
names.addItem("sentence");
names.addItem("for");
names.addItem("the");
names.addItem("linked");
names.addItem("list");
names.printList();
cout << endl;
names.addToHead("insert");
names.printList();
cout << endl;
cout << names.countItems() << endl;
cout << "Print reverse: " << endl;
names.printReverse();
cout << endl;
return 0;
}
现在我不确定为什么我的代码会崩溃,感谢任何帮助!
谢谢!
答案 0 :(得分:4)
在printList
内,您还必须检查head == NULL
,否则您正在访问指向NULL
的指针的成员。以下应该有效。
void printList()
{
node *temp = head;
while(temp != NULL) // don't access ->next
{
cout << temp->data << endl;
temp = temp->next;
}
}
在printReverse()
中,我真的不明白为什么你需要将一半的元素计数打印出来并在每次迭代中打印两个元素。但是,你真的不需要这里的for循环。您可以在循环后尽快停止temp == head
,此后您只需打印头部。并且只打印一个元素,即下一个指针指向先前打印元素的元素。
另一个递归尝试解决问题的方法如下:
void printReverse()
{
printReverseRecursive(head);
}
void printReverseRecursive(node *n)
{
if(n) {
printReverseRecursive(n->next);
cout << n->data << endl;
}
}
答案 1 :(得分:2)
您应该考虑重新编写循环以从最后一个元素开始(就像您已经完成的那样)并在到达head
时让循环条件停止。将for
循环中的代码加倍,以及奇怪的count/2
逻辑肯定让您(和我们)感到困惑。
temp = [last element]
while not at head
print temp
temp = previous element
print head
请注意,您已拥有temp = previous element
部分的代码:
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
因为我认为这是某种类型的赋值,所以我故意不为你提供c ++代码。即使它不是作业,考虑到这一点,通过它应该是你所经历的学习经历。但是,如果你试一试仍然有问题,请随时更新你的问题(或发布一个新问题)。
答案 2 :(得分:2)
void printReverse()
{
printReverse(head) //kickstart the overload function below
}
void printReverse(node *n)
{
if(n == 0) return;
printReverse(n->next); //print the next
cout << n->data << endl; //before printing me
}
答案 3 :(得分:1)
for(double count = countItems() / 2; count != 0; --count)
{
//Set temp2 before temp
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
cout << temp2->data<< " " << endl;
//Set temp before temp2
temp = head;
while(temp->next != temp2)
temp = temp->next;
cout << temp->data << " "<< endl;
}
cout << "EXIT LOOP" << endl;
由于第二个循环,您的程序崩溃了。 提示:只需将两个元素添加到列表中即可完成,例如“Hello” - &gt; “你” - &gt;空值。 并且仔细观察你的循环谓词(temp-&gt; next!= temp2)。
答案 4 :(得分:0)
print语句应该是这样的:
void print() {
node *temp;
temp= head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
答案 5 :(得分:0)
void ReversePrint(Node * head) {
Node *curNode=head;
if(curNode!=NULL){
if(curNode->next!=NULL){
ReversePrint(curNode->next);
}
cout<<curNode->data<<endl;
}
}