gpt4 book ai didi

c++ - 在 C++ 中使用链表作为类中的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:08 27 4
gpt4 key购买 nike

我正在尝试实现类似“facebook”的问题。

我创建了一个名为 User 的类。用户有一个 friend 列表。

我使用 C++ vector 对此进行了尝试,它没有任何问题。

然后我尝试使用我拥有的模板类将 vector 更改为 LinkedList

模板有拷贝构造函数和析构函数。

我已经测试和调试了其他数据类型的模板。

class User
{
private:
string uname;
//vector<User> myfriends;
LinkedList<User> myfriends;

public:
User() { uname = "none"; }
User(string n) { uname = n; }
string getName() { return uname; }
void addFriend(User &u)
{
//add u to me
myfriends.appendNode(u);

//add "me" to u
u.myfriends.appendNode(*this); //causes problem?

//myfriends.push_back(u); //when using vector
//u.myfriends.push_back(*this); //works when using vector

}
void listFriends()
{
cout << uname << " has " << myfriends.getSize() << " friends" << endl;
myfriends.displayList(); //prints values in linked list
}

friend ostream& operator<< (ostream& out, User u)
{
out << u.uname;
return out;
}

};

我希望 addFriend 函数建立“相互”连接。

这在我使用 vector 时有效,但在使用此 LinkedList 和此测试程序时:

User u1("joe");
User u2("sam");

u1.addFriend(u2);
u1.listFriends();

我得到了正确的输出

joe has 1 friends
sam

但是我也遇到了一个运行时错误,它告诉我我的指针发生了一些奇怪的事情。

"A problem caused the program to stop working correctly."

我正在使用 Visual Studio Express 2017。

我试图弄清楚以这种方式建立连接是否存在一些基本缺陷,并尝试绘制一些图片来解决这个问题。

对可能导致运行时错误的原因有什么想法吗?

这是 displayList() 函数:

template <class T> 
void LinkedList<T>::displayList()
{
//"walk" the list and print each value
ListNode *nodePtr;
//to walk the list
//start at the beginning
nodePtr = head;
//while there is a node to print
while (nodePtr) {
//display the value
cout << nodePtr->data << endl;
//move to next node
nodePtr = nodePtr->next;
}
}

这是LinkedList模板中的displayList代码

template <class T>
void LinkedList<T>::displayList()
{
//"walk" the list and print each value
ListNode *nodePtr; //to walk the list
//start at the beginning
nodePtr = head;
//while there is a node to print
while (nodePtr)
{
//display the value
cout << nodePtr->data << endl;
//move to next node
nodePtr = nodePtr->next;
}
}

这里是appendNode

template <class T>
void LinkedList<T>::appendNode(T value)
{
ListNode *newNode; //to point to a new node
ListNode *nodePtr; //to move through the list

//allicate a new node and store value
newNode = new ListNode;
newNode->data = value;
newNode->next = nullptr;

//if list is empty make this the first node
if (!head)
head = newNode;
else // insert at end of list
{
//initialize nodePtr to head of list
nodePtr = head;
//"walk" the listt to find the last node
while (nodePtr->next) //if not null this is true
{
nodePtr = nodePtr->next;
}
//nodePtr now points to last node in list
//add the new node
nodePtr->next = newNode;
//remember it's next has already been assigned to null
}
numElements++;

}

这是链接 https://repl.it/@prprice16/GrowlingFastRule

最佳答案

你有

LinkedList<User> myfriends;

当你这样做的时候

void addFriend(User &u) 
{
//...
}

您将对 User 进行完整复制,包括其中的 LinkedList 对象。但是,在您的 LinkedList 中,您没有指定赋值运算符,这意味着您传入的 User 的头部将被直接赋值,从而留下 2 个具有相同头部的 LinkedList。

因此同一个头指针将被释放两次。

关于c++ - 在 C++ 中使用链表作为类中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com