我的目标是创建一个链接器结构,然后使用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"));`