单链表的C++代码实现

C++实现

#include <iostream>
using namespace  std;

//结构的定义部分

typedef int  ElemType;      
typedef 
struct
 LNode{
  ElemType  data;
  LNode    
*
next;
*
LinkList;

//结构的生成操作

void InitList(LinkList & L)
{
  L
=
NULL;
}

//结构的清理操作

void ClearList(LinkList & L)
{
  
while
(L)
  {
    LNode 
*P=
L;
    L
=L->
next;
    delete P;
  }
}

//结构的销毁操作

void DestroyList(LinkList & L)
{
  ClearList(L);
}

//结构的状态查看

bool  ListEmpty(LinkList L)
{
  
return L==
NULL;
}

int
 ListLength(LinkList L)
{
  LNode 
*P=
L;
  
int len=0
;
  
while
(P)
  {
    len
++
;
    P
=P->
next;
  }
  
return
 len;
}

void
 ListOutput(LinkList L)
{
  cout
<<"("
;
  LNode 
*P=
L;
  
while(P&&P->
next)
  {
    cout
<<P->data<<","
;
    P
=P->
next;
  }
  
if(P) cout<<P->
data;
  cout
<<")"<<
endl;
}

void
 ListInfo(LinkList L)
{
  cout
<<"  "
;
  ListOutput(L);
  
if(ListEmpty(L)) cout<<"  Empty:Yes"<<
endl;
  
else cout<<"  Empty:No"<<
endl;
  cout
<<"  Length="<<ListLength(L)<<
endl;
}

//结构的查改增删

bool GetElem(LinkList L,int pos,ElemType & e)
{
  
if(pos<1return false
;
  LNode 
*P=
L;
  
int i=1
;
  
while(P&&i<
pos)
  {
    i
++
;
    P
=P->
next;
  }
  
if
(P)
  {
    e
=P->
data;
    
return true
;
  }
  
return false
;
}

bool
 ElemEqual(ElemType e1,ElemType e2)
{
  
return e1==
e2;
}

bool
 ElemPlus(ElemType e1,ElemType e2)
{
  
return e1>
e2;
}

bool
 ElemMinus(ElemType e1,ElemType e2)
{
  
return e1<
e2;
}

LNode 
*LocateElem(LinkList L,ElemType e,bool (*
compare)(ElemType,ElemType))
{
  LNode 
*P=
L;
  
while(P&&!(*compare)(P->data,e)) P=P->
next;
  
return
 P;
}

bool PutElem(LinkList &L,int
 pos,ElemType e)
{
  
if(pos<1return false
;
  LNode 
*P=
L;
  
int i=1
;
  
while(P&&i<
pos)
  {
    i
++
;
    P
=P->
next;
  }
  
if
(P)
  {
    P
->data=
e;
    
return true
;
  }
  
return false
;
}

bool ListInsert(LinkList &L,int
 pos,ElemType e)
{

  if(pos<0return false ;
  LNode 
*P=
L;
  
int i=1
;
  
while(P&&i<
pos)
  {
    i
++
;
    P
=P->
next;
  }
  
if(pos>0&&!P) return false
;
  LNode 
*Q=new
 LNode;
  Q
->data=
e;
  
if
(pos){
    Q
->next=P->
next;
    P
->next=
Q;
  }
  
else
{
    Q
->next=
L;
    L
=
Q;
  }
  
return true
;
}

bool ListDelete(LinkList &L,int pos,ElemType &
e)
{
  
if(!L||pos<1return false
;
  LNode 
*P=
L;
  
if(pos==1) L=L->
next;
  
else
{
    LNode 
*Q=
L;
    
int i=1
;
    
while(Q&&i<pos-1
)
    {
      i
++
;
      Q
=Q->
next;
    }
    
if(!Q||!Q->next) return false
;
    P
=Q->
next;
    Q
->next=P->
next;
  }
  e
=P->
data;
  delete P;
  
return true
;
}

//结构的功能测试  

int  main()
{
  cout
<<"无头结点的单链表结构的测试:"<<
endl;

  LinkList A;

  cout
<<"***************************************"<<
endl;
  cout
<<"生成操作:InitList(A)"<<
endl;
  InitList(A);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"插入操作:ListInsert(A,0,2)"<<
endl;
  ListInsert(A,
0,2
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"插入操作:ListInsert(A,1,7)"<<
endl;
  ListInsert(A,
1,7
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"插入操作:ListInsert(A,2,8)"<<
endl;
  ListInsert(A,
2,8
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"插入操作:ListInsert(A,2,21)"<<
endl;
  ListInsert(A,
2,21
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"插入操作:ListInsert(A,4,15)"<<
endl;
  ListInsert(A,
4,15
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"删除操作:ListDelete(A,5,e)"<<
endl;
  ElemType e;
  ListDelete(A,
5
,e);
  ListInfo(A);
  cout
<<"  e="<<e<<
endl;

  cout
<<"***************************************"<<
endl;
  cout
<<"更新操作:PutElem(A,4,39)"<<
endl;
  PutElem(A,
4,39
);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"查找操作:GetElem(A,2,e)"<<
endl;
  GetElem(A,
2
,e);
  ListInfo(A);
  cout
<<"  e="<<e<<
endl;

  cout
<<"***************************************"<<
endl;
  cout
<<"定位操作:LocateElem(A,15,ElemEqual)"<<
endl;
  ListInfo(A);
  cout
<<"  Address="<<LocateElem(A,15,ElemEqual)<<
endl;

  cout
<<"***************************************"<<
endl;
  cout
<<"定位操作:LocateElem(A,6,ElemPlus)"<<
endl;
  ListInfo(A);
  LNode 
*R=LocateElem(A,6
,ElemPlus);
  cout
<<"  Address="<<R<<
endl;
  
if(R) cout<<"  "<<R->data<<
endl;

  cout
<<"***************************************"<<
endl;
  cout
<<"定位操作:LocateElem(A,8,ElemMinus)"<<
endl;
  ListInfo(A);
  cout
<<"  Address="<<LocateElem(A,8,ElemMinus)<<
endl;

  cout
<<"***************************************"<<
endl;
  cout
<<"清空操作:ClearList(A)"<<
endl;
  ClearList(A);
  ListInfo(A);

  cout
<<"***************************************"<<
endl;
  cout
<<"销毁操作:DestroyList(A)"<<
endl;
  DestroyList(A);
  ListInfo(A);

  cout
<<"按任意键,结束..."
;
  cin.
get
();

  
return 0
;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

learnlife

向这个世界输出我独有的声音。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值