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

原创 2018年04月15日 22:57:44
  • 初始化

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);
      }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgege/article/details/79954777

数据结构之链表的基本操作

链表的基本操作。#include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; type...
  • wojiaohuangyu
  • wojiaohuangyu
  • 2015-05-22 17:14:59
  • 2126

数据结构--单链表的基本操作(C语言实现)

数据结构--单链表的基本操作(C语言实现)     #include #include #define ERROR 0 #define OK   1...
  • qq_33609401
  • qq_33609401
  • 2016-09-27 17:30:52
  • 1498

【数据结构】 链表的19种基本操作(完整版)

基于这篇文章: http://www.cnblogs.com/lifuqing/archive/2011/08/20/List.html 作者最后只给出了前面12中操作的代码,这里我帮他补全 链表...
  • fanxingzju
  • fanxingzju
  • 2014-04-03 17:11:21
  • 1629

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

该程序在vs2013中完成!!!单链表的基本函数:#include<stdio.h> #include<malloc.h> typedef ch...
  • Strive_0902
  • Strive_0902
  • 2018-04-01 19:58:29
  • 27

数据结构—单链表的基本操作(源代码)

#include <stdio.h> #include <stdlib.h> typedef int Elemtype; typedef s...
  • weixin_40908734
  • weixin_40908734
  • 2018-01-29 11:43:00
  • 76

数据结构实验报告单链表的基本操作

错误1 public void add(int idx,AnyType x){ Node newNode=new Node(x); if(headNode==null||idx==0){ newNod...
  • moonlululu
  • moonlululu
  • 2016-02-15 16:57:50
  • 1896

[数据结构]基本概念、单链表操作

单链表基本操作
  • napoay
  • napoay
  • 2015-08-28 09:12:08
  • 993

C语言-单链表的基本操作-严蔚敏版的数据结构

以下部分是头文件#ifndef __LianBiao__ #define __LianBiao__typedef int ElemType;typedef struct LNode { int...
  • yuhushangwei
  • yuhushangwei
  • 2017-08-02 07:55:19
  • 450

数据结构实验一--单链表的基本操作的算法

1、 掌握单链表存储结构的类型定义; 2、 实现单链表各种基本运算的算法。 3、 实现单链表各种基本运算的算法以及改进实验代码。...
  • hu1020935219
  • hu1020935219
  • 2013-10-08 18:38:24
  • 2401

《数据结构与算法》-单链表基本操作的C语言实现

最近在学算法内容,发现很多算法依赖于基本的数据结构,所以从新温习数据结构,记录一下,以后知识点忘记可以提醒自己哪里比较容易出错。 所用教材《数据结构与算法分析》by Mark Allen Weiss...
  • tengyuan93
  • tengyuan93
  • 2016-03-10 15:22:10
  • 1189
收藏助手
不良信息举报
您举报文章:数据结构-单链表的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)