链接器指针不会在c++中存储或递增
Linker pointer wont store or increment in c++
我的目标是创建一个链接器结构,然后使用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"));`
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 在reactor中存储eventHandlers的最佳方式是什么