线性表-链式存储结构

上次,我们学习了线性表的顺序存储结构,现在,我们再来看下线性表的链式存储结构,相比于顺序存储,链式存储结构在插入、删除等操作上降低了时间复杂度,但是在提取、求直接前驱和直接后继等操作上、没有线性表那么方便,这就需要我们必须熟练的掌握这两种存储方式,接下来,我们来看下链式存储结构的基本操作的实现

Status List_Init(SqListPtr L)
{
 Status s = fail;
 if(*L == NULL)
 {
  Ptr p = (Ptr)malloc(sizeof(Node));
  if(p == NULL) 
   return s;
  *L = p;
  (*L)->next = NULL;
  s = success;
 }
 return s;
}
void List_Destroy(SqListPtr L)
{
 List_Clear(L);
 if(*L)
 {
  free(*L);
  *L = NULL;
 }
}
void List_Clear(SqListPtr L)
{
 Ptr p;
 if(*L)
 {
  p = (*L)->next;
  while(p)
  {
   (*L)->next = p->next;
   free(p);
   p = (*L)->next;
  };
 }
}
bool List_Empty(SqListPtr L)
{
 return ((*L)->next == NULL);
}
int List_Size(SqListPtr L)
{
 int len  = 0;
 Ptr p = (*L)->next;
 while(p)
 {
  len++;
  p = p->next;
 }
 return len;
}
Status List_Retrival(SqListPtr L,int pos,ElemType * elem)
{
 Status s= rang_error;
 int i=1;
 Ptr p= (*L)->next;
 while(p && i<pos)
 {
  i++;
  p = p->next;
 }
 if(p && i==pos)
 {
  *elem = p->elem;
  s = success;
 }
 return s;
}
Status List_Locate(SqListPtr L,ElemType elem,int *pos)
{
 Status s = fail;
 Ptr p = (*L)->next;
 int i=1;
 while(p)
 {
  if(p->elem == elem)
  {
   s = success;
   *pos = i;
   break;
  }
  i++;
  p = p->next;
 }
 return s;
}
Status List_Find(SqListPtr L,int pos, SqListPtr pAddr)
{
 int i=1;
 Status s = fail;
 Ptr p = (*L)->next,q = (*L);
 while(i <= pos && p) //始终使得q指向p的直接前驱
 {
  q = p;
  p = p->next;
  i++;
 }
 if(i == pos+1 && q)///*********************************
 {
  (*pAddr) = q;
  s = success;
 }
 return s;
}
Status List_Insert(SqListPtr L,int pos,ElemType elem)
{
 Status s = fail;
 Ptr p,q;
 /*Ptr p = (*L)->next,q = (*L);
 while(i < pos && p) //始终使得q指向p的直接前驱
 {
  q = p;
  p = p->next;
  i++;
 }
 if(i == pos && p)
 {
  p = (Ptr)malloc(sizeof(Node));
  p->elem = elem;
  q->next = p; 
  s = success;
 }*/
 if(pos>1)
 {
  s = List_Find(L,pos-1,&q);
  if(s == success)
  {
   p = (Ptr)malloc(sizeof(Node));
   if(p)
   {
    p->elem = elem;
    p->next = q->next;
    q->next = p;
    s = success;
   }
  }
 }
 else
 {
  p = (Ptr)malloc(sizeof(Node));
  if(p)
  {
    p->elem = elem;
    p->next = (*L)->next;
    (*L)->next = p;
    s = success;
  }
 }
 return s;
}
Status List_delete(SqListPtr L,int pos)
{
 Status s = fail;
 Ptr p,q;
 /*
 Ptr p = (*L)->next,q = (*L);
 while(i<pos && p)
 {
  i++;
  q = p;
  p = p->next;
 }
 if(i == pos && p)
 {
  q->next = p->next;
  free(p);
  p = NULL;
 }*/
 s = List_Find(L,pos-1,&q);
 if(s == success)
 {
  p = q->next;
  if(p)
  {
   q->next = p->next;
   free(p);
   p = NULL;
   s = success;
  }
 }
 return s;
}
Status List_Prior(SqListPtr L,int pos,ElemType * elem)
{
 Status s;
 Ptr q;
 s = List_Find(L,pos-1,&q);
 if(s == success)
 {
  *elem = q->elem;
  s = success;
 }
 return s;
}
Status List_Next(SqListPtr L,int pos,ElemType * elem)
{
 Status s;
 Ptr q;
 s = List_Find(L,pos,&q);
 if(s == success)
 {
  if(q->next)
  {
   *elem = q->next->elem;
   s = success;
  }
  else
  {
   s = fail;
  }
 }
 return s;
}
void List_Print(SqListPtr L)
{
 Ptr p =(*L)->next;
 int i=1;
 while(p)
 {
  printf("%d,",p->elem);
  p = p->next;
  if(i++%10 == 0)
   printf("\n");
 }
}

大家可以就这两种存储方式做相互对照,如有问题,可以私信给我哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只学弱狗!

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值