c++学习笔记(17)线性链表的c++实现收获

class ChainNode
{
	friend class chain;   //friend class,the class chain can use the param of ChainNode
private:
	int data;
	ChainNode *link;
};
  
class chain  
{  
private:  
	ChainNode *first;
public:  
	chain(){first = new ChainNode; first = 0;} //相当于InitList  
	~chain();
	//void create(); //create a list   
	bool ListEmpty()const {return first == 0;}  //检查是否为empty  
	int Length()const;  //the length of the chain
    bool find(int num, int &x) const; //查看特定位置元素  
    int Search (const int &e);  //返回e 的位置   
    chain& ListInsert(int num, const int& e);  //插入数据元素e, 在num的位置  
    chain& ListDelete(int num, int &x);  //删除the place元素,and 赋值, 并返回这个chain  
	//void MergList(SqList La, SqList Lb, SqList &Lc);   //归并两个线性表
    void displayElem(ostream &out);  //遍历  //应该是输出到这个 ostream &out 里面。
};  
 

收获:

1.友元类的学习:这样声明后,chain类就可以使用ChainNode 中的所有成员,包括私有变量,和保护函数变量等。

如:我的析构函数:

  
chain::~chain()
{
	ChainNode *next;
	while(first)  //这样就可以清除所有节点。
	{
		next = first->link;
		delete first;
		first = next;
	}
}
2.异常处理:

在程序执行过程中,当我们遇到异常时,这个是经常使用的哦:

abort();

也可以:

throw OutOfBounds(); //异常处理 

3. 指针的赋值

构造函数中,我有个头指针的定义

chain(){first = new ChainNode; first = 0;} //相当于InitList  
在我进行插入时的程序如下
chain& chain::ListInsert(int num, const int& e)
{ //要想到内插,还是结尾的插
	//chain newch;
	ChainNode *TheNum;
	ChainNode *next = first;
	if(num > Length()+1)
	{
		//throw OutOfBounds(); //异常处理 or
		abort();
	}
	for(; num > 1; num--)
	{
		next = next->link;
	}

	TheNum = new ChainNode;   //remember it;
	TheNum->data = e;
	TheNum->link = 0;
	if(num == 1)
	{
		first = TheNum;
		return *this;
	}
	if(num == Length()+1)
	{
		next = TheNum;
		return *this;
	}
	TheNum->link = next->link;
	next->link = TheNum;
	//TheNum->link = Third;

	//newch.first = first;
	return *this;
}
我开始时 ,认为next = first 指针,这样对next指针做任何操作的时候,first指针的值也会发生变化,即

if(num == 1)
	{
		next = TheNum;
		return *this;
	}
我认为此时first指针中的值已经是TheNum的值,然而,我发现

c++学习笔记(17)线性链表的c++实现收获_第1张图片
经过很多的排查,了解到:first 在构造函数中被赋值NULL,除非你对她进行赋值,要不然她会一直指向NULL,当赋值之后在进行使用,就没问题了。First 为Null要进行赋值啊。

你可能感兴趣的:(C++,list,null,search,Class)