数据结构-单链表的基本操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgege/article/details/79954777
  • 初始化

void SLinkInit(SLinkNode** phead)
{
      assert(phead);
      *phead=NULL;
}
  • 打印链表


void SLinkPrint(SLinkNode* phead)
{

      if(  phead==NULL)
      {
            printf("actual:");
            printf("SLink is empty\n");
            return;
      }
      SLinkNode *cur=phead;
      printf("actual:");
     for(  ;cur!=NULL;cur=cur->next)
     {
           printf("%c-> ",cur->data);

     }
     printf("NULL\n");


}
  • 创建新节点


SLinkNode* SLinkCreat( DataType value)
{
      SLinkNode* newnode=(SLinkNode*)malloc(sizeof(SLinkNode));
      //如果失败,直接返回
      assert(  newnode);
      newnode->data=value;
      newnode->next=NULL;
      return newnode;


}
  • 尾插

//尾插
void SLinkPushBack(SLinkNode** pphead,DataType value)
{
      //如果链表为空,直接插入
      if(  *pphead==NULL)
      {
            *pphead=SLinkCreat(  value);
      }
      //不为空,先找到尾节点,然后在为节点后面插入
      else
      {
            //循环遍历,找尾节点
            SLinkNode* cur=*pphead;
            while(  cur->next!=NULL)
            {
                  cur=cur->next;
            }
            //找到尾节点,进行插入
            cur->next=SLinkCreat(value);
      }
}
  • 头插

//头插
void SLinkPushFront(SLinkNode** pphead,DataType value)
{
      //非法输入
      if(  pphead==NULL)
      {
            return ;
      }
      //链表为空,直接插入
      if(  *pphead==NULL)
      {

            SLinkCreat(  value);
      }
      //
      else
      {

            SLinkNode* newnode=SLinkCreat(  value);
            //将新节点的next直向原来头结点
            newnode->next=*pphead;
            //更新新节点
            *pphead=newnode;

      }
}
  • 头删

//头删
void SLinkPopFront(SLinkNode** pphead)
{

      if(  pphead==NULL)
      {
            return ;
      }
      //链表为空,删除失败
      if(  *pphead==NULL)
      {
            return;
      }
      //链表不为空
      else
      {
           //保存头结点的next
            SLinkNode* cur=(  *pphead)->next;
           //释放原有头结点,并更新头结点
            free(  *pphead);
            (  *pphead)=cur;
      }
}
  • 尾删

//尾删
void SLinkPopBack(  SLinkNode** pphead)
{
      if(  pphead==NULL)
      {
            return;
      }
      //只有一个节点
      if((  *pphead)->next==NULL)
      {
            free(*pphead);
            *pphead==NULL;
      }
      //至少两个节点
      else
      {
            //定义两个指针
            SLinkNode* pre=NULL,*cur=*pphead;
            //寻找尾节点
            while(  cur->next!=NULL)
            {
                  pre=cur;
                  cur=cur->next;
            }
            //找到尾节点后释放
            free(  cur);
            pre->next=NULL;
      }

}
  • 销毁链表


void SLinkDestory( SLinkNode** pphead)
{
      if(  pphead==NULL)
      {
            return;
      }
      //遍历链表并销毁
      SLinkNode* cur=*pphead;
      while(cur)
      {
          //定义一个_next指针用来保存cur->next,便于销毁cur
            SLinkNode* next=cur->next;

            free(cur);
            cur=next;
      }
      //将头指针置为NULL,避免成为野指针
      *pphead=NULL;
}
  • 查找

//查找
SLinkNode* SLinkFind(SLinkNode *phead,  DataType value)
{
      if( phead==NULL)
      {
            return ;
      }
      SLinkNode* cur=phead;
      //遍历式查找,找到返回该位置,否则返回NULL
      while(  cur)
      {

          if(  (  cur->data)==value)
          {
                return cur;
          }
          cur=cur->next;

      }
      return NULL;
}
  • 在指定位置前面插人

//在指定位置前面插人
void SLinkInsert(SLinkNode**  pphead,SLinkNode* pos,DataType value)
{
    if(pphead==NULL  )
    {
          return;
    }
    //链表为空或者位置非法,删除失败
    if(  *pphead==NULL||pos==NULL)
    {
          return ;
    }
    //p如果pos是头结点,则直接调用头插
    if( *pphead==pos)
    {
          SLinkPushFront(pphead,value);

    }
    //如果pos在链表中间位置
    else
    {
          //找到pos之前的位置
          SLinkNode* newnode=SLinkCreat(  value);
          SLinkNode* pre=*pphead;
          while(  pre->next!=pos)
          {
                pre=pre->next;
          }
          //找到pre指针,让它指向新节点,新节点指向pos
          pre->next=newnode;
          newnode->next=pos;
    }

}
  • 删除指定位置的值

//删除指定位置的值
void SLinkErase(SLinkNode** pphead,SLinkNode* pos)
{
      if( pphead==NULL)
      {
            return;
      }
      //链表为空或者位置非法,删除失败
      if(*pphead==NULL||pos==NULL)
      {
            return ;
      }
      //p如果pos是头结点,则直接调用头删
      if( *pphead==pos)
      {
            SLinkPopFront(  pphead);
      }
      //pos是尾节点
      else if(pos->next==NULL)
      {
            SLinkPopBack(  pphead);
      }
      //pos是链表中间位置
      else
      {
          //找到之前pos的之前的位置
            SLinkNode* pre=*pphead;
            while(  pre->next!=pos)
            {
                  pre=pre->next;
            }
            //保存posnext,销毁pos
            pre->next=pos->next;
            free(  pos);
      }
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页