链接:c实现的通用的双向链表现在用c++重新实现,思想大都一致:
不采用模板类,而采用虚函数实现多态性,达到通用的目的,data域不存储任何跟类型有关的信息,而是指针,将数据放于抽象类中,由指针与之建立联系。
链表有头指针 尾指针,以及之后的一系列插入删除打印操作,这些函数都写在链表类中。
链表指针类型为 链表结点类,结点的指针域和 data域,都是指针类型,data域 指向一个抽象类 object对象 。
object类是一个抽象类,当需要链表存放整型数据,就具体实现一个存放整型的子类去继承这个类,必须实现抽象类中的虚函数,以打印函数为例, 每一个不同数据类型的子类都得有自己的打印函数,而object 不关心如何打印。
class intobject :public Object
{
public:
intobject(int d = 0) :data(d)
{}
~intobject()
{}
void Print()const
{
cout << data << "-->";
}
private:
int data;
};
////////////////////////////////////////////////////////////
class strobject :public Object
{
public:
strobject(char *str)
{
if (str == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
}
~strobject()
{}
void Print()const
{
cout << "\"" << data << "\"" << "-->";
}
private:
char * data;
};
////////////////////////////////////////////////////////////
class floatobject :public Object
{
public:
floatobject(float d = 0) :data(d)
{}
~floatobject()
{}
void Print()const
{
cout << data << "-->";
}
private:
float data;
};
////////////////////////////////////////////////////////////
void main()
{
list mylist;
for (int i = 0; i < 5; ++i)
{
intobject *pi = new intobject(i);
mylist.push_back(pi);
}
mylist.printlist();
char* arr[5] = { "affd", "fdas", "fdfss", "ere", "qret" };
for (int i = 0; i < 5; i++)
{
strobject*ps = new strobject(arr[i]);
mylist.push_back(ps);
}
mylist.printlist();
float brr[5] = { 0.34, 54.32, 0.53, 43.2, 5.878 };
for (int i = 0; i < 5; i++)
{
floatobject*ps = new floatobject(brr[i]);
mylist.push_back(ps);
}
mylist.printlist();
}
链表的释放:
class Object
{
public:
Object()
{}
virtual ~Object()//因为是虚函数,调动父类析构的 同时 调动子类的析构
{}
////定义接口 通用的打印
virtual void Print()const = 0;//纯虚函数 子类继承了之后必须实现打印函数
};
class list;
class listnode
{
friend class list;
public:
listnode()
{
data = NULL;
next = NULL;
}
listnode(Object *pobj)
{
data = pobj;
next = NULL;
}
~listnode()
{
delete data;
next = NULL;
}
private:
Object *data;
listnode *next;
};
class list
{
public:
list()
{
head = tail = new listnode;
}
~list()
{
listnode *delp = head->next;
while (delp!= tail)
{
head->next = delp->next;
delete delp;
delp = head->next;
}
delete head;
head = tail = NULL;
}
void push_back(Object *pb)//尾插
{
listnode *s = new listnode(pb);
assert(s != NULL);
tail->next = s;
tail = s;
}
void printlist()const
{
listnode *p = head->next;
while (p != NULL)
{
p->data->Print();
p = p->next;
}
cout << "NULL" << endl;
}
private:
listnode *head;
listnode *tail;
};
////////////////////////////////////////////////////////////
class intobject :public Object
{
public:
intobject(int d = 0) :data(d)
{}
~intobject()
{
cout << "delete int" << endl;
}
void Print()const
{
cout << data << "-->";
}
private:
int data;
};
////////////////////////////////////////////////////////////
class strobject :public Object
{
public:
strobject(char *str)
{
if (str == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(str) + 1];
strcpy(data, str);
}
}
~strobject()
{
cout << "delete string" << endl;
delete []data;
data = NULL;
}
void Print()const
{
cout << "\"" << data << "\"" << "-->";
}
private:
char * data;
};
相关