无头单链表

简介: 无头单链表

一、单链表结构的定义

//单链表结构的定义
typedef int SLNDataType;//数据类型
typedef struct SListNode {
  SLNDataType val;//结点数据域
  struct SListNode* next;//结点指针域
}SLNode;

二、单链表结点的创建

//单链表结点的创建
SLNode* CreateNode(SLNDataType x)
{
  SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));//为新结点申请空间
  if (newnode == NULL)//申请失败
  {
    perror("malloc fail");
    exit(-1);
  }
  newnode->val = x;//新结点数据域
  newnode->next = NULL;//新结点指针域
  return newnode;
}

三、单链表打印

//单链表的打印
void SLTPrint(SLNode* phead)
{
  SLNode* cur = phead;
  while (cur)
  {
    printf("%d->", cur->val);
    cur = cur->next;
  }
  if (cur == NULL)
    printf("NULL\n");
}

四、单链表尾插

//单链表的尾插
void SLTPushBack(SLNode** pphead, SLNDataType x)
{
    assert(pphead);
  SLNode* newnode = CreateNode(x);
  //链表为空
  if (*pphead == NULL)
  {
    *pphead = newnode;
  }
  else//链表不为空
  {
    SLNode* tail = *pphead;
    while (tail->next)//找尾结点
    {
      tail = tail->next;
    }
    tail->next = newnode;//尾插
  }
}

五、单链表头插

//单链表头插
void SLTPushFront(SLNode** pphead, SLNDataType x)
{
    assert(pphead);
  SLNode* newnode = CreateNode(x);
  newnode->next = *pphead;
  *pphead = newnode;
    //SLNode* newnode = CreateNode(x);
  链表为空
  //if (*pphead == NULL)
  //{
  //  *pphead = newnode;
  //}
  //else//链表不为空
  //{
  //  SLNode* tmp = *pphead;
  //  *pphead = newnode;
  //  (*pphead)->next = tmp;
  //}
}

六、单链表尾删

//单链表尾删
void SLTPopBack(SLNode** pphead)
{
  assert(pphead);
  assert(*pphead);//链表不能为空
  if ((*pphead)->next == NULL)//链表只有一个结点
  {
    free(*pphead);
    *pphead = NULL;
  }
  else//链表有多个结点
  {
    SLNode* tail = *pphead;
    SLNode* prev = NULL;
    while (tail->next != NULL)
    {
      prev = tail;
      tail = tail->next;
    }
    prev->next = NULL;
    free(tail);
    tail = NULL;
  }
}

七、单链表头删

//单链表头删
void SLTPopFront(SLNode** pphead)
{
  assert(pphead);
  assert(*pphead);
  //SLNode* tmp = *pphead;
  //*pphead = (*pphead)->next;
  //free(tmp);
  //tmp = NULL;
  SLNode* tmp = (*pphead)->next;
  free(*pphead);
  *pphead = tmp;
}

八、单链表查找(返回找到的结点)

//单链表查找(返回找到的结点)
SLNode* SLTFind(SLNode* phead, SLNDataType x)
{
  if (phead == NULL)
    return NULL;
  else
  {
    SLNode* cur = phead;
    while (cur)
    {
      if (cur->val == x)
        return cur;
      cur = cur->next;
    }
    return cur;//return NULL;
  }
}

九、单链表任意位置插入

//单链表任意位置插入
void SLTInsert(SLNode** pphead, SLNode* pos, SLNDataType x)
{
  assert(pphead);
  assert(pos);//必须在有效结点处插入
  assert(*pphead);//如果pos是有效结点,那么链表一定不为空
  SLNode* newnode = CreateNode(x);
  if (*pphead == pos)//插入位置在头结点处
  {
    //头插
    SLTPushFront(pphead, x);
  }
  else
  {
    SLNode* cur = *pphead;
    while (cur->next != pos)//找插入位置的前一结点
    {
      cur = cur->next;
    }
    newnode->next = cur->next;
    cur->next = newnode;
  }
}

十、单链表任意位置删除

//单链表任意位置删除
void SLTErase(SLNode** pphead, SLNode* pos)
{
  assert(pphead);
  assert(pos);//删除的必须是有效结点
  assert(*pphead);//链表不能为空
  if (*pphead == pos)//删除的结点是头结点
  {
    //头删
    SLTPopFront(pphead);
  }
  else
  {
    SLNode* cur = *pphead;
    while (cur->next != pos)//找删除结点的前一结点
    {
      cur = cur->next;
    }
    cur->next = pos->next;
    free(pos);
    pos = NULL;
  }
}

十一、单链表任意位置后插入

//单链表任意位置后插入
void SLTInsertAfter(SLNode* pos, SLNDataType x)
{
  assert(pos);//必须是有效结点
  SLNode* newnode = CreateNode(x);
  newnode->next = pos->next;
  pos->next = newnode;
}

十二、单链表任意位置后删除

//单链表任意位置后删除
void SLTEraseAfter(SLNode* pos)
{
  assert(pos);//必须是有效结点
  assert(pos->next);//如果pos是最后一个结点,那么pos的后一位置为空
  SLNode* tmp = pos->next;
  pos->next = tmp->next;
  free(tmp);
  tmp = NULL;
}

十三、单链表任意位置插入(不提供链表头结点)

先进行任意位置后插入,再交换两个结点的值

//单链表任意位置插入(不提供链表头结点)
void SLTInsertNohead(SLNode* pos, SLNDataType x)
{
  assert(pos);
  SLTInsertAfter(pos, x);//先在pos位置后插入
  pos->next->val = pos->val;
  pos->val = x;
}


目录
相关文章
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
818 1
|
2月前
|
弹性计算 开发者
2026年阿里云服务器最低价格是多少?2核2G、2核4G、4核8G等配置活动价和券后价格参考
2026年阿里云推出多款低价云服务器,轻量服务器2核2G38元1年,经济型e实例2核2G99元1年,u1实例2核4G199元1年,u2a实例4核8G云服务器最低898.20元一年。除特价云服务器和新用户选u2a实例之外,经济型e和九代云服务器均支持叠加使用优惠券,因此最低价格为叠加使用优惠券之后的价格。
390 8
|
3月前
|
存储 人工智能 JSON
Agent系统
大模型Agent是具备自主规划、推理、工具调用与记忆能力的智能系统,能分解任务、反思调整并持续交互。核心架构含大脑(LLM)、感知、行动与记忆模块,支持函数调用与多Agent协作,广泛应用于复杂任务场景,区别于传统Chatbot,更具主动性与执行力。
157 0
|
人工智能 数据可视化 计算机视觉
Ultralytics YOLO11来啦!更快!更强!
YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的 Joseph Redmon 和 Ali Farhadi 开发。
Ultralytics YOLO11来啦!更快!更强!
|
运维 负载均衡 监控
部署硬件负载均衡和软件负载均衡时,分别需要考虑哪些因素?
部署硬件负载均衡和软件负载均衡时,分别需要考虑哪些因素?
485 127
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
600 5
|
JSON JavaScript 前端开发
TypeScript(十五)配置相关(命令行配置)
TypeScript(十五)配置相关(命令行配置)
299 4
|
缓存 JavaScript Java
苍穹外卖开发心得(下)
苍穹外卖开发心得(下)
497 5
|
域名解析 对象存储 数据安全/隐私保护
如何 Wordpress 使用 OSS 上传图片、文件
如何使用 OSS 上传 Wordpress 的图片文件
3484 2
|
存储 JSON 数据可视化
Seata Saga 模式快速入门和最佳实践
Seata Saga 模式快速入门和最佳实践
7216 11

热门文章

最新文章