链接器指针不会在c++中存储或递增

Linker pointer wont store or increment in c++

本文关键字:存储 c++ 指针 链接      更新时间:2023-10-16

我的目标是创建一个链接器结构,然后使用add_ordered函数按字母顺序插入新链接,然后按字母顺序打印。add_ordered函数中的指针'*p'似乎没有递增,这是我问题的核心。如有任何帮助,将不胜感激

#include <iostream>
#include <string>
using namespace std;
void print_all(struct Link *p);

struct Link{
    const string name;
    const string mythology;
    Link* prev;
    Link* succ;
    Link(const string& b, const string& m, Link *p=0, Link *s=0)
        :name(b), mythology(m), prev(p), succ(s){} //Constructor
};
Link* add_ordered(Link *p, Link *n)
{
    //cout << "Name" << p->name << endl;
    if(n==0) return p;
    if(p==0) return n;
   // cout << "next" << p->succ << endl;
    while(p)
    {
        if(p->name > n->name)
        {
            cout << p->name << " " << n->name << endl;
            n->succ = p;
            if(p->prev) p->prev->succ=n;
            n->prev = p->prev;
            p->prev = n;

            //cout << "word" << endl;
            return n;
            //cout << "COOL" << endl;
        }
        //cout << "Howzit" << endl;
        p = p->succ;
    }
}
int main()
{
    //Create new pointer 'Gods' of type Link.
    //NB!! Gods is a pointer.
    Link* gods = new Link("Posidon", "Greek");
    add_ordered(gods, new Link("Thor", "Norse"));
    add_ordered(gods, new Link("Freia", "Norse"));
    add_ordered(gods, new Link("Athena", "Greek"));
    add_ordered(gods, new Link("Odin", "Norse"));
    add_ordered(gods, new Link("Zeus", "Greek"));
    add_ordered(gods, new Link("Apollon", "Greek"));
    print_all(gods);
    //cout << gods->name << endl;
    return 0;
}
void print_all(Link *p)
{
    cout << "{";
    while(p)
    {
        cout << p->name;
        if(p = p->succ)
            cout << ",";
    }
    cout << "}";
}

您遇到的主要问题是,一旦创建了第一个节点,就不允许更改第一个指针

Link* gods = new Link("Posidon", "Greek");

那么神永远不能指向另一个节点,因为你的add_ordered函数原型不允许这个

Link* add_ordered(Link *p, Link *n)

相反,要更改p,您需要传递p的地址,或者在while语句之后实际返回一些内容(如果不是复制/粘贴问题,您也忘记了这样做)。

Link* add_ordered(Link **p, Link *n)

另一件你做得不对的事情是比较名字,就像你现在所做的那样,你是在比较名字的地址,而不是名字本身。使用strcmp(即)修复此问题

if ( strcmp(p->name, n->name) == -1 )

编辑:

您应该返回列表的第一个元素。这样,您就可以在函数中更改它,然后就不需要将第一个元素的地址传递给函数。

gods = add_ordered(gods, new Link( ... ));

在您的函数add_ordered中,您检查链接是否应该在前面,然后只需修改新元素以指向gods指向的旧元素。

if ( strcmp(..) )
{
   p->prev = n;
   n->succ = p;  // this becomes the new first element
   n->prev = NULL;
   return n;
}
else // find where it should be inserted

如果我以下面的方式调用函数,那么它就可以工作了,但为什么把我的链接指针神分配给函数是有意义的呢?再次感谢您的专业知识

Link* gods = new Link("Posidon", "Greek");
gods =add_ordered(gods, new Link("Thor", "Norse"));
gods =add_ordered(gods, new Link("Freia", "Norse"));
gods =add_ordered(gods, new Link("Athena", "Greek"));
gods =add_ordered(gods, new Link("Odin", "Norse"));
gods =add_ordered(gods, new Link("Zeus", "Greek"));
gods =add_ordered(gods, new Link("Apollon", "Greek"));`