C++ 打印链接列表仅打印头部节点
在随机填写一个包含52张卡片的链表之后。当我尝试打印它时,它将打印头节点52次。“遍历链表逻辑”或插入逻辑是否有问题 这些是节点助手方法(aC++ 打印链接列表仅打印头部节点,c++,linked-list,C++,Linked List,在随机填写一个包含52张卡片的链表之后。当我尝试打印它时,它将打印头节点52次。“遍历链表逻辑”或插入逻辑是否有问题 这些是节点助手方法(abagNode有一个CardOfBag和一个next) 以下是链接列表的方法(称为bag): 它有头、尾和当前bagNode*指针 void bag::add(bagNode *node) // adds node to random position { int i, place, size; place = randomPosition();
bagNode
有一个CardOfBag
和一个next)
以下是链接列表的方法(称为bag
):
它有头、尾和当前bagNode*
指针
void bag::add(bagNode *node) // adds node to random position
{
int i, place, size;
place = randomPosition();
size = getCurrentSize();
if (size == 0) // for initial insertion into empty linked list
{
setHead(node);
setTail(node);
alterSize(1);
} else {
if ((size - 1) == place) // if the insertion is at the last node
{
this->tail->setNext(node);
setTail(node);
alterSize(1);
} else {
if (place == 0) // if insertion is at head node
{
node->setNext(this->head);
setHead(node);
alterSize(1);
} else {
setCurrent(place); // for any insertion in between first and last nodes
node->setNext(current->getNext());
current->setNext(node);
alterSize(1);
}
}
}
}
int bag::getCurrentSize() // returns size of bag (linked list)
{
return this->size;
}
void bag::alterSize(int num) // changes the size int of bag by num
{
this->size = this->size + num;
}
int bag::randomPosition() // generates random number from 0 to size exclusive
{
int size = getCurrentSize();
if (size != 0)
return (rand() % size);
}
void bag::setCurrent(int desiredPosition) // this traverses the current pointer
// by desiredPosition steps from the head node
{
int i;
this->current = this->head;
for (i = 0; i < desiredPosition; i++) {
this->current->setNext(this->current->getNext());
}
}
bagNode *bag::getCurrentNode() // returns node of current pointer
{
return this->current;
}
void bag::add(bagNode*node)//将节点添加到随机位置
{
国际,地点,大小;
位置=随机位置();
size=getCurrentSize();
if(size==0)//用于初始插入到空链表中
{
设置头(节点);
setTail(节点);
改变大小(1);
}否则{
if((size-1)=place)//如果插入在最后一个节点上
{
此->尾部->设置下一步(节点);
setTail(节点);
改变大小(1);
}否则{
if(place==0)//如果插入在头节点
{
节点->设置下一步(此->头部);
设置头(节点);
改变大小(1);
}否则{
setCurrent(place);//用于第一个和最后一个节点之间的任何插入
节点->设置下一步(当前->获取下一步());
当前->设置下一步(节点);
改变大小(1);
}
}
}
}
int bag::getCurrentSize()//返回包的大小(链表)
{
返回此->大小;
}
void bag::alterSize(int num)//按num更改包的大小int
{
此->大小=此->大小+数量;
}
int bag::randomPosition()//生成从0到大小的随机数
{
int size=getCurrentSize();
如果(大小!=0)
返回值(rand()%size);
}
void bag::setCurrent(int desiredPosition)//它遍历当前指针
//通过从头部节点定位步骤
{
int i;
此->当前=此->头部;
对于(i=0;icurrent->setNext(this->current->getNext());
}
}
bagNode*bag::getCurrentNode()//返回当前指针的节点
{
返回此->当前;
}
bagNode::setNext()应该指向提供的节点的下一个点;不要使用其他节点:
void bagNode::setNext(bagNode* setNode) //sets next bagnode
{
this->next = setNode;
}
您的包::setCurrent()不工作。你应该让这个->当前继续“下一步”,直到你达到想要的位置,而不是你只改变它的下一个指针到与以前的值相同
改为这样做:
void bag::setCurrent(int desiredPosition)
{
int i;
this->current = this->head;
for(i = 0; i < desiredPosition; i++)
{
this->current = this->current->getNext();
}
}
void bag::setCurrent(int desiredPosition)
{
int i;
此->当前=此->头部;
对于(i=0;icurrent=this->current->getNext();
}
}
现在应该工作得更好了。在您的函数中
void bag::setCurrent(int desiredPosition)
您根本没有更改此->当前。基本上你在这个函数中什么也没做。很抱歉,只是修复了它。
setCurrent
以一种奇怪的方式修改了列表。你有没有在调试器中处理过这个问题?我尝试过使用gdb,但我不知道如何充分使用它。我应该找什么?setCurrent()函数被许多其他函数使用,它不会导致程序抛出任何错误。虽然与问题无关,但如果rand()
可能返回负数,那么rand()%size
可能是负数。this->current
是否有变化?@rcgldr不完全确定您的意思,setter没有更改next的值吗?啊,明白了(编辑后)。是的,编辑我的答案。这修正了它,谢谢!但是,我仍然不明白为什么这个->当前->设置下一步(这个->当前->获取下一步();不工作?setNext(节点)设置.next指针。getNext()获取当前的.next指针。所以你的代码应该是“设置我的下一个指针到我当前的下一个指针”哦,哇,我感觉像在idoit中。。。真不敢相信我没看到,再次谢谢你!你可以通过1)解释为什么什么都没做,2)提出问题的解决方案来强化这个答案。
void bag::setCurrent(int desiredPosition)