在C+中以相反顺序打印我的链接列表+; 所以我对C++比较陌生,今天我决定坐下来,理解链接列表是如何工作的。到目前为止,我做这件事很有意思,但我在尝试以相反顺序打印链接列表时遇到了一个问题(而不是按链接列表的相反顺序!)

在C+中以相反顺序打印我的链接列表+; 所以我对C++比较陌生,今天我决定坐下来,理解链接列表是如何工作的。到目前为止,我做这件事很有意思,但我在尝试以相反顺序打印链接列表时遇到了一个问题(而不是按链接列表的相反顺序!),c++,linked-list,C++,Linked List,另外,我想在没有双链接列表的情况下做到这一点: #include <iostream> #include <string> using namespace std; class LinkedList { public: LinkedList() { head = NULL; } void addItem(string x) { if

另外,我想在没有双链接列表的情况下做到这一点:

#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;
}
#包括
#包括
使用名称空间std;
类链接列表
{
公众:
LinkedList()
{
head=NULL;
}
无效附加项(字符串x)
{
if(head==NULL)
{
头=新节点();
head->next=NULL;
头部->数据=x;
}否则{
节点*温度=头部;
while(临时->下一步!=NULL)
温度=温度->下一步;
node*newNode=newNode();
newNode->data=x;
newNode->next=NULL;
temp->next=newNode;
}
}
作废打印列表()
{
节点*温度=头部;
while(临时->下一步!=NULL)
{
下一步是收集数据;
}
cout data next=温度;
头部->数据=x;
}
int countItems()
{
整数计数=1;
对于(节点*temp=head;temp->next!=NULL;temp=temp->next)
++计数;
返回计数;
}
void printReverse()
{
节点*temp2;
节点*温度=头部;
while(临时->下一步!=NULL)
温度=温度->下一步;
//在进入循环之前打印最后一个节点
cout data next!=temp)
temp2=temp2->next;
cout data next!=temp2)
温度=温度->下一步;

printList
中,您还必须检查
head==NULL
,否则您正在访问指向
NULL
的指针的成员

    void printList()
    {
        node *temp = head;
        while(temp != NULL) // don't access ->next
        {
            cout << temp->data << endl;
            temp = temp->next;
        }
    }

您应该考虑重新编写循环以在最后一个元素(如您所做的那样)开始,并且在到达<代码>标题>代码>时,循环条件停止。在<<代码> > <代码>循环中,伴随着奇数<代码>计数/ 2 逻辑肯定迷惑了您(和我们)。 请注意,您已经拥有

temp=previous元素的代码:

temp2 = head;
while(temp2->next != temp)
    temp2 = temp2->next;

因为我假设这是一种类型的赋值,我故意不给你C++代码。即使不是赋值,记住它的过程应该是你正在经历的学习体验。但是,如果你给它一个机会,仍然有问题,随时更新你的问题(或者发布一个新的问题)。.

void printReverse()
{
printReverse(head)//启动下面的重载功能
}
void printReverse(节点*n)
{
如果(n==0)返回;
printReverse(n->next);//打印下一个
cout data
for(双重计数=countItems()/2;计数!=0;--count)
{
//将temp2设置在temp之前
temp2=头部;
while(temp2->next!=temp)
temp2=temp2->next;
cout-datanext;

cout data打印语句应采用以下方式:

void print() {
    node *temp;
    temp= head;
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}
void print(){
节点*温度;
温度=水头;
while(temp!=NULL){
下一步是收集数据;
}
}
无效反向打印(节点*头)
{    
节点*curNode=头部;
if(curNode!=NULL){
如果(curNode->next!=NULL){
反向打印(curNode->next);
}

cout data你的代码崩溃是什么意思?它是如何崩溃的?当你运行它时会发生什么?因为代码使用奇数个元素(没有“insert”元素),但使用偶数失败,这应该给你一个提示…@SethCarnegie:为什么这么说?+1只是因为你似乎愿意学习东西,这是(悲哀的)很少在关于堆栈溢出的初学者问题中看到。@DougRamsey很抱歉没有提供更多关于堆栈溢出的信息。这是我在这里的第一篇帖子,我下次会记住。这不是真正的问题。问题在于当
countItems()
很奇怪时,
countItems()永远不会达到零。@akappa不。
countItems()/2
的计算结果为int(虽然使用
双精度
作为计数器完全是WTF)@Andreitta:oops,是的。重点是。@akappa是的,你是对的,但是这是我看到的第一件事。更新了我的答案。+1,在写我的答案之前我应该先看看你的答案。但这非常简单(对我们来说)谢谢你的回答。这不是作业,但我还是不喜欢被填鸭式的回答。我会看看在你的提示后我是否能自己弄明白。@Marcan你的代码中已经有了所有的基本元素,你只需要删除一些代码并将你的循环修改为
,而不是
循环r
循环。这甚至不对,你不能向后循环……这是一个单循环link@acid这是他问题的一部分挑战。请注意,我并没有说我们的
temp2=temp2->previous
,因为这显然需要一个双链接列表。但这并不意味着没有办法获得之前的元素t、 其他答案建议使用递归,这对小列表是可行的,但如果列表可能很大,并且您需要很少向后打印(希望如此),则有方法获取上一个元素(例如,再次遍历列表,保留单独的列表等)。这似乎是为了学习,所以我怀疑性能是否值得关注。@JaredC:经过思考,有一种方法可以实现一个循环,而不会让它非常痛苦(比如n*n)。好吧,这对我来说已经足够好了
temp2 = head;
while(temp2->next != temp)
    temp2 = temp2->next;
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
}
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;
void print() {
    node *temp;
    temp= head;
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}