C++链表类链表析构函数数求助

c++中的单向链表写法:实现增删查改、构造函数、运算符重载、析构函数等。建立头文件SList.h#pragma&once
typedef&int&DataT
//SList要访问SListNode,可以通过友元函数实现,友元函数在被访问的类中
class&SListNode
friend&class&SL//友元函数
SListNode(const&DataType&x)
,&_next(NULL)
SListNode*&_
DataType&_
class&SList
:_head(NULL)
,&_tail(NULL)
SList(const&SList&&s)
:_head(NULL)
,&_tail(NULL)
SListNode*&cur&=&s._
while&(cur)
this-&PushBack(cur-&_data);
cur&=&cur-&_
////深拷贝的传统写法
//SList&&operator=(const&SList&&s)
// if&(this&!=&&s)
SListNode*&cur&=&s._
while&(cur)
this-&PushBack(cur-&_data);
cur&=&cur-&_
// return&*
//深拷贝的现代写法
SList&&operator=(SList&&s)
swap(_head,&s._head);
swap(_tail,&s._tail);
void&Clear();
void&PushBack(DataType&x);
void&PopBack();
void&PushFront(DataType&x);
void&PopFront();
//void&Insert(size_t&pos,DataType&x);
void&Insert(SListNode*&pos,&DataType&x);
void&Erase(SListNode*&pos);
SListNode*&Find(DataType&x);
void&PrintSList();
SListNode*&_
SListNode*&_
};各函数的实现#include&iostream&
using&namespace&
#include"SList.h"
#include&assert.h&
void&SList::Clear()
SListNode*&cur&=&_
while&(cur)
SListNode*&del&=&
cur&=&cur-&_
&&&&&&del&=&NULL;
void&SList::PrintSList()//打印链表
SListNode*&cur&=&_
while&(cur)
cout&&&&cur-&_data&&&&"-&";
cur&=&cur-&_
cout&&&&"NULL"&&&&
void&SList::PushBack(DataType&x)//尾插
if&(NULL&==&_head)
_head&=&new&SListNode(x);//开辟一个值为x的新结点
//SListNode*&
//cur-&_data&=&x;
&&&&//_tail-&_next&=&
//_tail&=&
_tail-&_next=&new&SListNode(x);
_tail&=&_tail-&_
void&SList::PopBack()//尾删
if&(NULL&==&_head)
cout&&&&"SList&is&empty!"&&&&
else&if&(_head&==&_tail)
_head&=&_tail&=&NULL;
SListNode*&cur&=&_//找到要删除尾节点的前一个节点cur
while&(cur-&_next-&_next)
cur&=&cur-&_
delete&cur-&_
cur-&_next&=&NULL;
void&SList::PushFront(DataType&x)//头插
SListNode*&tmp&=&_
_head=new&SListNode(x);
_head-&_next&=&
void&SList::PopFront()//头删
if&(NULL&==&_head)
cout&&&&"SList&is&empty!"&&&&
else&if&(NULL&==&_head-&_next)
_head&=&NULL;//delete后要将指针设空,否则产生野指针
SListNode*&tmp&=&_head-&_
//void&SList::Insert(size_t&pos,&DataType&x)
// assert(pos);
// SListNode*&tmp&=&_
// pos&-=&1;
// while&(--pos)
tmp&=&tmp-&_
// if&(NULL&==&tmp)
SList::PushBack(x);
SListNode*&next&=&tmp-&_
SListNode*&cur&=&new&SListNode(x);
tmp-&_next&=&
cur-&_next&=&
void&SList::Insert(SListNode*&pos,&DataType&x)////指定位置处插入x
assert(pos);
SListNode*&tmp&=&_
while&(tmp)
if&(NULL&==&tmp-&_next)
SList::PushFront(x);
else&if&(pos&==&tmp-&_next)
SListNode*&cur&=&new&SListNode(x);
cur-&_next=&tmp-&_
tmp-&_next&=&
//注意结束循环
tmp&=&tmp-&_
void&SList::Erase(SListNode*&pos)
assert(pos);
SListNode*&tmp&=&_
while&(tmp)
if&(NULL&==&tmp-&_next)
SList::PopFront();
else&if&(pos&==&tmp-&_next)
SListNode*&cur&=&tmp-&_next-&_
delete&tmp-&_
tmp-&_next&=&NULL;
tmp-&_next&=&
//注意结束循环
tmp&=&tmp-&_
SListNode*&SList::Find(DataType&x)
SListNode*&cur&=&_
while&(cur)
if&(x&==&cur-&_data)
cur&=&cur-&_
return&NULL;
}各操作的测试用例void&Test1()
{//尾插尾删
S.PushBack(1);
S.PushBack(2);
S.PushBack(3);
S.PushBack(4);
S.PrintSList();
S.PopBack();
S.PrintSList();
//S.PopBack();
//S.PopBack();
//S.PrintSList();
//S.PopBack();
//S.PopBack();
//S.PopBack();
SList&S1(S);
S1.PrintSList();
S2.PrintSList();
void&Test2()
{//头插头删
S.PushFront(1);
S.PushFront(2);
S.PushFront(3);
S.PushFront(4);
S.PrintSList();
S.PopFront();
S.PrintSList();
S.PopFront();
S.PopFront();
S.PopFront();
S.PrintSList();
S.PopFront();
void&Test3()
{//指定位置插入某数,查找某数
S.PushBack(1);
S.PushBack(2);
S.PushBack(4);
S.PushBack(5);
S.PrintSList();
//S.Insert(3,&3);
SListNode*&p&=&S.Find(4);
S.Insert(p,&3);
S.PrintSList();
void&Test4()
{//删除某结点
S.PushBack(1);
S.PushBack(2);
S.PushBack(3);
S.PushBack(10);
S.PushBack(4);
S.PushBack(5);
S.PrintSList();
SListNode*&p&=&S.Find(10);
S.Erase(p);
S.PrintSList();
}友元函数& & &在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。1.1使用友元函数的优缺点优点:能够提高效率,表达简单、清晰。缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。1.2友元函数的参数因为友元函数没有this指针,则参数要有三种情况:(1)&要访问非static成员时,需要对象做参数;(2)要访问static成员或全局变量时,则不需要对象做参数;(3)如果做参数的对象是全局对象,则不需要对象做参数;1.3友元函数的位置因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。1.4友元函数的调用可以直接调用友元函数,不需要通过对象或指针友元函数和类的成员函数的区别成员函数有this指针,而友元函数没有this指针。友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。本文出自 “” 博客,请务必保留此出处
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26819次
排名:千里之外
原创:120篇
(1)(1)(9)(14)(97)本帖子已过去太久远了,不再提供回复功能。单链表的析构函数算法~LinkList_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单链表的析构函数算法~LinkList
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 c 虚析构函数 的文章

 

随机推荐