本篇博客中代码的实现中采用了友元的使用,但一般写代码尽量不适用友元,除非万不得已,具体代码如下:
#include<iostream>
typedef int ElemType;
class LinkList;//为使用友元,做一个声明
class Node
{
public:
Node(ElemType val=0)
:data(val),next(NULL)
{
}
private:
ElemType data;
Node* next;
friend class LinkList;//友元
};
class LinkList
{
public:
LinkList();
~LinkList();
Node* findPos(int pos);//找pos之前的结点,方便插入
void insertPos(ElemType val,int pos);//按位插入
void insertHead(ElemType val);//头插
void insertTail(ElemType val);//尾插
void deletePos(int pos);//按位删除
void show();
private:
Node* head;
};
LinkList::LinkList()
{
head=new Node();
}
LinkList::~LinkList()
{
Node* pcur=head;
Node* pnext;
while(pcur!=NULL)
{
pnext=pcur->next;
delete pcur;
pcur=pnext;
}
head=NULL;
}
Node* LinkList::findPos(int pos)
{
Node* p=head;
if(pos<0||pos>p->data)
{
std::cout<<"位置不合法!"<<std::endl;
exit(0);
}
while(pos>0)
{
p=p->next;
pos--;
}
return p;
}
void LinkList::insertPos(ElemType val,int pos)
{
if(pos<0||pos>head->data)
{
std::cout<<"位置不合法!"<<std::endl;
exit(0);
}
Node* newnode=new Node(val);
Node* s=findPos(pos);
if(s->next==NULL)
{
s->next=newnode;
head->data++;
return ;
}
newnode->next=s->next;
s->next=newnode;
head->data++;
}
void LinkList::insertHead(ElemType val)
{
return insertPos(val,0);
}
void LinkList::insertTail(ElemType val)
{
return insertPos(val,head->data);
}
void LinkList::deletePos(int pos)
{
if(pos<0||pos>=head->data)
{
std::cout<<"位置不合法!"<<std::endl;
exit(0);
}
Node* p=findPos(pos);
Node* s=p->next;
p->next=s->next;
delete s;
head->data--;
}
void LinkList::show()
{
Node* p=head->next;
while(p)
{
std::cout<<p->data<<" ";
p=p->next;
}
std::cout<<std::endl;
}
int main()
{
LinkList a;//测试用例
for(int i=0;i<5;i++)
{
a.insertHead(i+1);
}
for(int i=0;i<5;i++)
{
a.insertTail(i+1);
}
a.show();
a.deletePos(9);
a.show();
return 0;
}
代码运行结果如下: