今天尝试写一个双链表,写完之后试一下反向迭代,结果发现老是 输出为空,解决之后又有一个死循环,死循环解决之后又总是最后一个输出为垃圾数。以下是解决的思路
先分享已解决之后的源码
主函数和头文件部分不变
#include "ChainTable.h"
int main(void)
{
DoubleList testDouble;
testDouble.display(testDouble.initChain_end());
return 0;
}
#ifndef CHAINTABLE_2_CHAINTABLE_H
#define CHAINTABLE_2_CHAINTABLE_H
#include <iostream>
using namespace std;
struct Node{
int data;
Node *next;
};
struct doubleNode{
int data;
doubleNode *prior;
doubleNode *next;
};
class DoubleList{
private:
public:
doubleNode *initChain_end();
doubleNode *initChain_head();
void display(doubleNode *head);
void Redisplay(doubleNode *head);
};
#endif //CHAINTABLE_2_CHAINTABLE_H
方法函数
#include "ChainTable.h"
doubleNode *DoubleList::initChain_end() {
auto *head = new doubleNode;
head ->next = nullptr;//少写则异常输出
head ->prior = nullptr;//少写则异常输出
auto prev = head;
cout << "How many?";
int num;
cin >> num;
for (int i = 0; i < num; ++i) {
auto temp = new doubleNode;
temp ->data = i;
prev ->next = temp;
temp ->prior = prev;
prev = temp;
temp ->next = nullptr;//少写则异常输出
}
while(head ->next != nullptr)
head = head ->next;
return head ;
}
void DoubleList::display(doubleNode *head) {
auto cur = head;
while (cur ->prior){
cout << cur -> data << " ";
cur = cur -> prior;
}
}
输出为空
在方法部分,我一开始在19行写的是
while(head )
head = head ->next;
return head ;
这样写的话head最后会直接指向nullptr,在display函数哪里一判断,发现是nullptr,直接就不进行输出了
死循环
问题出在第五行和第六行
我display函数的判断结束条件是cur为nullptr,因为它是向前迭代的,如果我没有第6行,那指到头指针的时候就没有nullptr于是就会死循环 -- 没有判断结束条件
垃圾数
一开始我在display函数的输出是这样写的
while (cur){
cout << cur -> data << " ";
cur = cur -> prior;
}
如果这样写,循环会一直进行到头指针的位置,我们知道头指针是不储存数据的,所以这里我就思考,垃圾数大概率都和头指针输出有关,而且我注意到,此时代码还是正常退出,证明该节点存在,不过是个哑结点,所以直接把循环条件改成当cur指向的下一个为nullptr即可!