关于使用c++指针遇到的问题

C++语言 码拜 9年前 (2016-04-26) 1373次浏览
本人写了一个关于用链表表示队列的简单函数,要求实现队列的插入和删除函数,同时本人为了测试程序,重载了操作符<<,但就是在操作符重载的代码出使用指针出了问题,这个问题本人遇到好几次,本人调试后知道问题在哪行代码了,但还是没能通过本人解决该问题,故希望有高手能够来为本人解答一下,下面是源码和错误展示:
首先贴出本人写的代码:

#ifndef LISTQUEUE_H_
#define LISTQUEUE_H_
#include <iostream>
using namespace std;
template<class T>
struct ListQueueNode
{
	T data;
	ListQueueNode<T> * link;
};
template<class T>
class ListQueue{
private:
	ListQueueNode<T> * front, *rear;
public:
	ListQueue();
	~ListQueue();
	void EnQueue(const T & x);
	bool DeQueue(T & x);
	friend ostream & operator<<<>(ostream & os, ListQueue<T> & l);
};
template<class T>
ListQueue<T>::ListQueue()
{
	front = rear = NULL;
}
template<class T>
ListQueue<T>::~ListQueue()
{
	ListQueueNode<T> * temp;
	while (front->link != NULL)    //删除至队列的最后一个节点
	{
		temp = front;
		front = front->link;
		delete temp;
	}
}
template<class T>
void ListQueue<T>::EnQueue(const T & x)
{
	if (front == NULL)//假如对列为空则该节点成为队列的第一个节点
	{
		ListQueueNode<T> * newNode = new ListQueueNode < T >;
		front = rear = newNode;
		newNode->data = x;
	}
	else//队列不为空
	{
		ListQueueNode<T> * newNode = new ListQueueNode < T >;
		newNode->data = x;
		rear->link = newNode;
		rear = newNode;
	}
}
template<class T>
bool ListQueue<T>::DeQueue(T & x)
{
	if (front == NULL)
	{
		cout << "队列为空,无法进行出队列操作!" << endl;
		return false;
	}
	else
	{
		ListQueueNode<T> * temp;
		temp = front;
		front = front->link;
		x = temp->data;
		delete temp;
	}
}
template<class T>
ostream & operator<<<>(ostream & os, ListQueue<T> & l)   //友元函数,重载操作符<<
{
	while (l.front != NULL)              //当队列不为空时继续输出
	{
		os << l.front->data << " ";    //进行调试后,本人知道是这里除了问题,
	    l.front = l.front->link;
	}
	return os;
}
#endif
// ex3-25.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "ListQueue.h"
int _tmain(int argc, _TCHAR* argv[])
{
	ListQueue<int> a;
	int value;
	for (int i = 0; i < 5; i++)  //初始化,为简单起见,测试程序默认输入5个节点,当然可以随意决定输入节点数,原因是这是链表表示的队列,所以不会产生溢出
	{
		cout << "请输入插入的第" << i + 1 << "个节点的值: ";
		cin >> value;
		a.EnQueue(value);
	}
	cout << a;                  //确认输入的5个节点值
	int temp;
	a.DeQueue(temp);           //进行出队列测试
	cout << a;                 //检查出队列结果
	system("pause");
	return 0;
}

同时给出运行结果和调试结果:
关于使用c++指针遇到的问题
关于使用c++指针遇到的问题
关于使用c++指针遇到的问题
求高手解释,感激不尽

解决方案

40

局部变量 l.front替代ListQueue<T>&会调用拷贝构造,导致析构出错的
用一个指针记录下第一个元素的地址,遍历完以后再让l.front重新指回第一个元素就行
上面EnQueue函数里,应该将newNode->link = NULL;否则最后一个元素的link不是NULL会崩

#ifndef LISTQUEUE_H_
#define LISTQUEUE_H_
#include <iostream>
 
using namespace std;
 
template<class T>
struct ListQueueNode
{
    T data;
    ListQueueNode<T> * link;
};
 
template<class T>
class ListQueue{
private:
    ListQueueNode<T> * front, *rear;
public:
    ListQueue();
    ~ListQueue();
    void EnQueue(const T & x);
    bool DeQueue(T & x);
    friend ostream & operator<<<>(ostream & os, ListQueue<T>  &l);
};
 
template<class T>
ListQueue<T>::ListQueue()
{
    front = rear = NULL;
}
 
template<class T>
ListQueue<T>::~ListQueue()
{
    ListQueueNode<T> * temp;
    while (front->link != NULL)    //删除至队列的最后一个节点
    {
        temp = front;
        front = front->link;
        delete temp;
    }
}
 
template<class T>
void ListQueue<T>::EnQueue(const T & x)
{
    if (front == NULL)//假如对列为空则该节点成为队列的第一个节点
    {
        ListQueueNode<T> * newNode = new ListQueueNode < T >;
        front = rear = newNode;
        newNode->data = x;
    }
    else//队列不为空
    {
        ListQueueNode<T> * newNode = new ListQueueNode < T >;
		newNode->link = NULL;
        newNode->data = x;
        rear->link = newNode;
        rear = newNode;
    }
}
 
template<class T>
bool ListQueue<T>::DeQueue(T & x)
{
    if (front == NULL)
    {
        cout << "队列为空,无法进行出队列操作!" << endl;
        return false;
    }
    else
    {
        ListQueueNode<T> * temp;
        temp = front;
        front = front->link;
        x = temp->data;
        delete temp;
    }
}
 
template<class T>
ostream & operator<<<>(ostream & os, ListQueue<T>  &l)   //友元函数,重载操作符<<
{
	ListQueueNode<T> *temp = l.front;
    while (l.front != NULL)              //当队列不为空时继续输出
    {
        os << l.front->data << " ";    //进行调试后,本人知道是这里除了问题,
        l.front = l.front->link;
    }
	os << endl;
	l.front = temp;
    return os;
}
#endif

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于使用c++指针遇到的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)