c++為什么我的頭結點在單鏈表類里用不了呢( ? ^ ? )
明明我寫了公有繼承,頭結點也是保護型別的定義,但是無法在子類里訪問
可能是腦子有點混沌沒發現問題吧,能請好心人們幫我看一下嗎?
#include <iostream>
using namespace std;
//結點定義φ( > ω<*)
template <class type>
class ListNode //結點類
{
public:
ListNode () //建立空節點 or 默認建構式
{next = NULL;}
ListNode(const type &item, ListNode <type> *next1 = NULL)
{
data = item; //item為參考可回傳值??
next = next1; //next初始都為空
}
type data; //之后的鏈表類里有對指標和資料的直接操作,所以設為了public
ListNode <type> *next;
} ;
template <class type>
class ablinklist //抽象鏈表類
{
protected:
int length; //鏈表長度
ListNode<type> *head; //頭結點的定義
public :
// int length; //鏈表長度
// ListNode<type> *head;
ListNode <type> *GetHead() //獲得頭結點指標
{ //懂了,函式型別是結點指標型別,回傳指標
return head;
}
ListNode <type> *GetNext(ListNode<type> &n)
{
return n.next ==head?n.next->next:n.next; //如果n指向頭結點則回傳 頭結點的下一個
/*是為了回圈鏈表嗎?*/ //如果n不是指向頭結點則回傳他的下一個結點的地址
}
type Get(int i); //取出第i個結點的元素
ListNode<type> *Find(int i); //找到第i個結點
ListNode<type> *Find1(type value); //以value值搜索
bool Set (type x , int i); //將表中的第i個元素設值
void MakeEmpty(); //置為空表
virtual bool Insert(type value,int i) = 0;//插入元素到某位置
virtual type Remove(int i) = 0; //洗掉i結點
virtual type Remove1(type value) = 0; //將value的結點洗掉(有多個怎么辦?是不是改進一下?)
/*當當當當~~~~~~全部模板定義完成剩下看自己的了(*^ ^*) */
};
template <class type>
void ablinklist<type>::MakeEmpty()//清空函式
{
int i = 1;
ListNode<type> *q = head->next;
while( i++<=length )
{
head->next = q->next;
delete q;
q = head->next;
}
length = 0;
}
template <class type>
bool ablinklist<type>:: Set (type x , int i)//設值函式
{
ListNode<type> *p = Find(i);
if(p == NULL||p == head) //i不符合時Find會回傳NULL或head
return false;
else
p->data = x;
return true;
}
template <class type>
ListNode<type> *ablinklist<type>::Find1(type value)//找值函式
{
int j = 1;
ListNode<type> *p = head->next;
for ( j = 1;j <= length&&p->data != value ;j++ )
{
p = p->next;
}
return p;
}
template <class type>
ListNode<type> *ablinklist<type>::Find(int i)//查找函式
{
int j = 1;
if (i < 0||i > length )
return NULL;
else if(i == 0)
return head;
ListNode<type> *p = head-> next;
for( j = 1;j < i ;j++ )
{
p = p->next;
}
return p;
}
template <class type>
type ablinklist<type>::Get(int i) //取值函式
{
ListNode<type> *p = Find(i);
assert(p && p!= head); //強制假設防止運行錯誤,自動生成除錯資訊
if (p ==NULL || p == head)
return false; //迷惑,要自定義嗎?
else
return p->data;
}
/*下面寫單鏈表的具體定義 車干哭泣*/
template <class type>
class List :public ablinklist<type> //z這個里面無法訪問到head和length
// ******問題所在*****
{
public :
List() //構造一個空鏈表
{
head = new ListNode<type> ;
length = 0;
}
List (List <type> & l) //拷貝一個現有的鏈表
{ Copy(l); }
~List()
{ MakeEmpty(); } //有借有還
List<type> &Copy(List <type>&l); //拷貝函式 參考型別??????
type Remove(int i); //s洗掉結點i
bool Insert(type value, int i); //新元素插入到結點i****最重要的建立函式
type Remove(type value); //洗掉value的結點(有多個怎么辦?是不是改進一下?)
};
template <class type>
type List <type>::Remove(type value)
{
ListNode<type> *q ,*p = head;
while(p->next != NULL&&p->next->data!=value)
{
p = p->next; //找出value的前一個結點
}
if(p->next == NULL)
return false; //ErrData到底是什么
q = p->next;
p->next = q->next; //重新接連
delete q;
length --;
return value;
}
template <class type>
bool List <type>::Insert(type value, int i)//插入結點
{
ListNode <type> *p = Find(i - 1); //定位
if(p == NULL) //判定
return false;
//建立新節點
ListNode <type> *newnode = new ListNode <type> (value , p->next);
assert(newnode);
if(newnode == NULL )
return false; //記憶體分配是否成功?
p->next = newnode;
length ++;
return true;
}
template <class type>
type List <type>::Remove(int i)//洗掉i結點
{
ListNode <type> *p =Find(i - 1) ,*q ; //p定位i-1結點
assert(p&&p->next) //判定p不空并且不是最后一個
if(p == NULL ||p->next ==NULL)
return false;
q = p->next;
p->next = q->next; //重新接上鏈表
type value = q->data; //保留被洗掉的資料
delete q;
length --;
return value;
}
template <class type>
List <type> &List <type>::Copy(List<type> & l)//復制
{
ListNode <type> *p,*q,*r;
length = l.length;
head = NULL;
if(!l.head)
{
return *this;
}
head = new ListNode<type>;
if(!head)
{
return *this;
}
/*p147 未完待續 */
head->data = (l.head)->data; //鏈表頭結點內容復制給當前
head->next = NULL;
r = NULL;
p = head;
q = l.head->next;
while(q)
{
r = new ListNode<type >;
if(!r)
{
return *this;
}
r->data = q->data;
r->next = NULL;
p->next = r;
p = p->next;
q = q->next;
}
return *this;
//寫完之后變成了大大的迷惑!備注下次再加吧。。。
}
//還需要洗掉value
//多載賦值運算子
//多載輸出運算子
int main(int argc, char** argv)
{
}
uj5u.com熱心網友回復:
最后一個類里無法訪問head,和lengthuj5u.com熱心網友回復:
把子類里所有的head 和 length改成this->head,this->length;因為你這種做法是不正確。
例如
template<typename T>
struct Base{
T p;
}
template<>
struct Base<int>{
enum{ p=1;}
}
template<typename T>
struct Child:struct{
void sum(T x){
p=x;
}
}
如果 有一個child<int> 將會出現兩難的判斷。
uj5u.com熱心網友回復:
嗯嗯,十分感謝??,我去試一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64586.html
標籤:C++ 語言
上一篇:C初學者出現疑問
