下面是源代码:
-----------------------------------------------------------
#include<iostream>
#define OK 1
#define ERROR 0
#define ELEMS 10
#define LINK(X) static_cast<Link>(X)
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}*Link,*Position;
typedef int Status;
////////////////////////////////////////////////////
//LinkList类声明
//
class LinkList
{
private:
Link head,tail,cur;
int len;
int SumOfElem(Link s)const;
public:
LinkList();
~LinkList();
Status InitElem();
Status InitElem(int number);
Status ClearList();
Status InsFirst(Link &s);
Status DelFirst();
Status Append(Link &s);
Status Remove(Link &q);
Status InsBefor(Link &p,Link &s);
Status InsAfter(Link p,Link &s);
Status SetCurElem(Link p,int e);
Status GetCurElem(Link &p);
Status ListEmpty();
Status LocatePos(Link p);
// Status ListTraverse(); 什么意思?
int ListLength();
Position NewLNode();//自加函数
Position GetHead()const;
Position GetLast();
Position PriorPos(Link &p);
Position NextPos(Link &p);
void PutList();
};
////////////////////////////////////////////////////
//LinkList类实现 |修改len+=SumOfElem(s);的使用
//
int LinkList::SumOfElem(Link s)const
{
int sum=0;
while(s!=NULL)
{
s=s->next;
sum++;
}
return sum;
}
LinkList::LinkList()
{
head=(Link)new LNode;
head->next=NULL;
tail=cur=head;
len=0;
}
LinkList::~LinkList()
{
cur=head;
while(head!=NULL)
{
head=head->next;
delete cur;
cur=head;
}
}
Status LinkList::InitElem()
{
int i;
Link temp;
cout<<"Initialize a list with "<<ELEMS<<" numbers:"<<endl;
for (i=0;i<ELEMS;i++)
{
temp=NewLNode();
cin>>temp->data;
InsFirst(temp);
}
if (!ListEmpty())
return OK;
else
return ERROR;
}
Status LinkList::InitElem(int number)
{
Link temp;
cout<<"Initialize a list with "<<number<<" numbers:"<<endl;
for (int i=0;i<ELEMS;i++)
{
temp=NewLNode();
cin>>temp->data;
InsFirst(temp);
}
if (!ListEmpty())
return OK;
else
return ERROR;
}
Status LinkList::ClearList()
{
Link temp;
temp=head->next;
cur=temp;
head->next=NULL;
while(temp!=NULL)
{
temp=temp->next;
delete cur;
cur=temp;
}
tail=head;
len=0;
return OK;
}
Status LinkList::InsFirst(Link &s)
{
int length=SumOfElem(s);
if(head==tail)
tail=s;
s->next=head->next;
head->next=s;
len+=length;
return OK;
}
Status LinkList::DelFirst()
{
if(head!=tail&&len>0)
{
cur=head->next;
head->next=cur->next;
len--;
}
else
{
cout<<"ERROR in DelFirst:len<0"<<endl;
return ERROR;
}
return OK;
}
Status LinkList::Append(Link &s)
{
int length=SumOfElem(s);
if(tail->next==NULL)
tail->next=s;
else
{
cout<<"ERROR in Append:tail->next!=NULL"<<endl;
return ERROR;
}
while(tail->next!=NULL)
tail=tail->next;
len+=length;
return OK;
}
Status LinkList::Remove(Link &q)
{
cur=PriorPos(tail);
q=tail;
tail=cur;
tail->next=NULL;
len--;
if(len<0)
{
cout<<"ERROR in Remove:len<0!"<<endl;
return ERROR;
}
else
return OK;
}
Status LinkList::InsBefor(Link &p,Link &s)
{
int length=SumOfElem(s);
if(p==head)
{
cout<<"Can't insert in front of head pointer!"<<endl;
return ERROR;
}
else if(p==tail&&head==tail)
{
InsFirst(s);
}
else
{
cur=PriorPos(p);
}
s->next=p;
cur->next=s;
len+=length;
return OK;
}
Status LinkList::InsAfter(Link p,Link &s)
{
int length=SumOfElem(s);
if(head==tail)
InsFirst(s);
s->next=p->next;
p->next=s;
len+=length;
return OK;
}
Status LinkList::SetCurElem(Link p,int e)
{
if(p==head)
{
cout<<"Can't set the head pointer."<<endl;
return ERROR;
}
else if(p!=NULL)
p->data=e;
else
{
cout<<"Unknown ERROR!"<<endl;
return ERROR;
}
return OK;
}
Status LinkList::GetCurElem(Link &p)
{
if(p==head)
{
cout<<"Can't visit the head pointer."<<endl;
return ERROR;
}
else if(p!=NULL)
return p->data;
else
{
cout<<"Unknown ERROR!"<<endl;
return ERROR;
}
return OK;
}
Status LinkList::ListEmpty()
{
return head==tail;
}
Status LinkList::LocatePos(Link p)
{
int location=0;
cur=head;
while(cur!=p)
{
cur=cur->next;
location++;
}
if(location>0&&location<=len)
return location;
else
{
cout<<"ERROR in LocatePos:location is a wrong number."<<endl;
return ERROR;
}
}
int LinkList::ListLength()//Checked
{
return len;
}
Position LinkList::NewLNode()
{
Link temp;
temp=(Link)new LNode;
temp->data=0;
temp->next=NULL;
return temp;
}
Position LinkList::GetHead()const//Checked
{
if(head)
return head;
else
{
cout<<"ERROR in GetHead:head=NULL!";
return NULL;
}
}
Position LinkList::GetLast()//Checked
{
if(tail)
return tail;
else
{
cout<<"ERROR in GetLast:tail=NULL!";
return NULL;
}
}
Position LinkList::PriorPos(Link &p)
{
cur=head;
while(cur->next!=p&&cur!=NULL)
cur=cur->next;
if(cur==NULL)
return NULL;
else
return cur;
}
Position LinkList::NextPos(Link &p)
{
if(p!=NULL)
return p->next;
else
return NULL;
}
void LinkList::PutList()
{
int i=0;
cur=head->next;
while(cur!=NULL)
{
cout<<cur->data<<" ";
cur=cur->next;
i++;
}
cout<<endl;
cout<<"Totally putout "<<i<<" numbers,And totally recorded "<<len<<" numbers!"<<endl;
}
////////////////////////////////////////////////////
//主函数
//
int main()
{
LinkList nLink,nLink1;
nLink.InitElem();
nLink.PutList();
nLink1.InitElem();
nLink1.PutList();
nLink1.DelFirst();
nLink1.PutList();
return 0;
}
//经测试程序运行正常,未发现明显错误,但还没有深入调试潜在错误,有待后续测试~!