数据结构实验--单链表(C++实现)

下面是源代码:

-----------------------------------------------------------

#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;
}

 

 

 

//经测试程序运行正常,未发现明显错误,但还没有深入调试潜在错误,有待后续测试~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值