【单链表】无头单项不循环(2)

简介: 【单链表】无头单项不循环(2)

今天链表。

Test.c主函数

#include"SList.h"
int main()
{
  SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
  test5(&phead);//测试查找
  test6(&phead);//测试在pos前面插入
  test7(&phead);//测试在pos后面插入
  test8(&phead);//测试删除pos后面的元素
  test9(&phead);//测试删除pos的元素
  return 0;
}

test5

void test5(SLNode** pphead)//测试查找
{
  SLNode*ret=SLFind(*pphead, 77);
  if (ret != NULL)
  {
    printf("找到了:%d\n", ret->val);
  }
  else
  {
    printf("没找到\n");
  }
}

test6

void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLInsert(pphead, ret, 34);
  SLNode* pos = SLFind(*pphead, 34);
  SLInsert(pphead, pos,  78);
  SLPrint(*pphead);
}

test7

void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLInsertAfter(pphead, ret, 99);
  SLPrint(*pphead);
}

test8

void test8(SLNode** pphead)//测试删除pos后面的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLEraseAfter(pphead, ret);//99
  SLPrint(*pphead);
}

test9

void test9(SLNode** pphead)//测试删除pos的元素
{
  SLNode* ret = SLFind(*pphead, 78);
  SLErase(pphead, ret);
  SLPrint(*pphead);
}

Test.c总代码

#include"SList.h"
void test1(SLNode** pphead)//测试尾插
{
  SLPushBack(pphead, 10);
  SLPushBack(pphead, 20);
  SLPushBack(pphead, 30);
  SLPushBack(pphead, 40);
  SLPrint(*pphead);
}
void test2(SLNode** pphead)//测试头插
{
  SLPushFront(pphead, 77);
  SLPushFront(pphead, 66);
  SLPushFront(pphead, 55);
  SLPushFront(pphead, 33);
  SLPrint(*pphead);
}
//
void test3(SLNode** pphead)//测试头删
{
  SLPopFront(pphead);
  SLPopFront(pphead);
  SLPopFront(pphead);
  SLPrint(*pphead);
}
void test4(SLNode** pphead)//测试尾删
{
  SLPopBack(pphead);
  SLPopBack(pphead);
  SLPrint(*pphead);
}
void test5(SLNode** pphead)//测试查找
{
  SLNode*ret=SLFind(*pphead, 77);
  if (ret != NULL)
  {
    printf("找到了:%d\n", ret->val);
  }
  else
  {
    printf("没找到\n");
  }
}
void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLInsert(pphead, ret, 34);
  SLNode* pos = SLFind(*pphead, 34);
  SLInsert(pphead, pos,  78);
  SLPrint(*pphead);
}
void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLInsertAfter(pphead, ret, 99);
  SLPrint(*pphead);
}
void test8(SLNode** pphead)//测试删除pos后面的元素
{
  SLNode* ret = SLFind(*pphead, 77);
  SLEraseAfter(pphead, ret);//99
  SLPrint(*pphead);
}
void test9(SLNode** pphead)//测试删除pos的元素
{
  SLNode* ret = SLFind(*pphead, 78);
  SLErase(pphead, ret);
  SLPrint(*pphead);
}
int main()
{
  SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
  test1(&phead);//测试尾插
  test2(&phead);//测试头插
  test3(&phead);//测试尾删
    test4(&phead);//测试头删
  test5(&phead);//测试查找
  test6(&phead);//测试在pos前面插入
  test7(&phead);//测试在pos后面插入
  test8(&phead);//测试删除pos后面的元素
  test9(&phead);//测试删除pos的元素
  return 0;
}

SList.h头文件&函数声明

头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

函数声明

  • 单链表元素查询
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
  • 在pos前面位置插入元素
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
  • 在pos后面插入元素
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
  • 删除pos后面的位置的元素
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
  • 删除pos位置的元素
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
  • 空间释放
//空间释放
void SLDestroy(SLNode** pphead);

SList.h总代码

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//创建单链表
typedef int SLNDataType;//单链表节点数据类型
typedef struct SListNode//创建节点
{
  SLNDataType val;
  struct SListNode* next;
}SLNode;
//打印数据
void SLPrint(SLNode* phead);
//尾插
void SLPushBack(SLNode** pphead, SLNDataType x);
//头插
void SLPushFront(SLNode** pphead, SLNDataType x);
//头删
void SLPopFront(SLNode** pphead);
//尾删
void SLPopBack(SLNode** pphead);
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
//空间释放
void SLDestroy(SLNode** pphead);

SList.c函数实现

查询SLFind

//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
  SLNode* cur = phead;
  while(cur)
  {
    if (cur->val == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}

pos前面插入  

//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
  //严格限定单链表里面必须有一个有效节点
  assert(pphead);//应该没有人喝醉酒了吧
  assert(*pphead);
  assert(pos);
  SLNode* newnode = CreateNode(x);
  SLNode* cur = *pphead;
  SLNode* prve = NULL;
  //适合中间和尾
  if (prve)
  {
    while (cur != pos)
    {
      prve = cur;
      cur = cur->next;
    }
    prve->next = newnode;
    newnode->next = cur;
  }
  else
  {
    //头插
    SLPushFront(pphead, x);
  }
}

pos后面插入

//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
  //严格限定单链表里面必须有一个有效节点
  assert(pphead);//应该没有人喝醉酒了吧
  assert(*pphead);
  assert(pos);
  SLNode* newnode = CreateNode(x);
  newnode->next = pos->next;
  pos->next = newnode;
  //头和尾都不用处理。
}

pos后面删除

//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
  //pos在最后一个不可
  assert(pos->next);
  assert(pos);
  SLNode* tmp = pos->next;
  pos->next = pos->next->next;
  free(tmp);
  tmp = NULL;
}

pos删除

//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
  assert(pos);
  SLNode* cur = *pphead;
  SLNode* prve = NULL;
  if (prve)
  {
    while (cur != pos)
    {
      prve = cur;
      cur = cur->next;
    }
    prve->next = cur->next;
    free(pos);
    pos = NULL;
  }
  else
  {
    *pphead = pos->next;
    free(pos);
    pos = NULL;
  }
}

空间释放

//空间释放
void SLDestroy(SLNode** pphead)
{
  assert(*pphead);
  SLNode* cur = *pphead;
  while (cur)
  {
    SLNode* tmp = cur->next;
    free(cur);
    cur = tmp;//cur=cur->next
  }
}

SList.c总代码

#include"SList.h"
void SLPrint(SLNode* phead)
{
  assert(phead);
  SLNode* tail = phead;
  printf("phead->");
  while (tail->next != NULL)
  {
    printf("%d->", tail->val);
    tail = tail->next;
  }
  printf("NULL");
  printf("\n");
}
//创建链表的节点---结构体
SLNode* CreateNode(SLNDataType x)
{
  SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
  if (newnode == NULL)
  {
    perror("malloc");
    return;
  }
  newnode->val = x;
  newnode->next = NULL;
  return newnode;
}
//测试尾插
void SLPushBack(SLNode** pphead, SLNDataType x)
{
  //assert(*pphead);
  SLNode* newnode = CreateNode(x);
  //无节点
  if (*pphead == NULL)
  {
    *pphead = newnode;
  }
  //多个节点
  else
  {
    SLNode* tail = *pphead;
    while (tail->next != NULL)
    {
      tail = tail->next;
    }
    tail->next = newnode;
  }
}
//头插
void SLPushFront(SLNode** pphead, SLNDataType x)
{
  //assert(*pphead);
  SLNode* newnode = CreateNode(x);
    newnode->next = *pphead;
    *pphead = newnode;
}
//---删除就涉及空间的释放---断言(删过头)
//头删
void SLPopFront(SLNode** pphead)
{
  assert(*pphead);
  SLNode* tail = *pphead;
  *pphead = (*pphead)->next;
  free(tail);
  tail = NULL;
}
//尾删
void SLPopBack(SLNode** pphead)
{
  assert(*pphead);
  //一个节点
  if ((*pphead)->next == NULL)
  {
    free(*pphead);
    *pphead = NULL;
  }
  else
  {
    SLNode* tail = *pphead;
    SLNode* prve = NULL;//虽然这里prve置为NULL和tail都是一样,但是在OJ题目当中会出错
    while (tail->next != NULL)
    {
      prve = tail;
      tail = tail->next;
    }
    prve->next = NULL;
    free(tail);
    tail = NULL;
  }
}
//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
  SLNode* cur = phead;
  while(cur)
  {
    if (cur->val == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
  //严格限定单链表里面必须有一个有效节点
  assert(pphead);//应该没有人喝醉酒了吧
  assert(*pphead);
  assert(pos);
  SLNode* newnode = CreateNode(x);
  SLNode* cur = *pphead;
  SLNode* prve = NULL;
  //适合中间和尾
  if (prve)
  {
    while (cur != pos)
    {
      prve = cur;
      cur = cur->next;
    }
    prve->next = newnode;
    newnode->next = cur;
  }
  else
  {
    //头插
    SLPushFront(pphead, x);
  }
}
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
  //严格限定单链表里面必须有一个有效节点
  assert(pphead);//应该没有人喝醉酒了吧
  assert(*pphead);
  assert(pos);
  SLNode* newnode = CreateNode(x);
  newnode->next = pos->next;
  pos->next = newnode;
  //头和尾都不用处理。
}
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
  //pos在最后一个不可
  assert(pos->next);
  assert(pos);
  SLNode* tmp = pos->next;
  pos->next = pos->next->next;
  free(tmp);
  tmp = NULL;
}
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
  assert(pos);
  SLNode* cur = *pphead;
  SLNode* prve = NULL;
  if (prve)
  {
    while (cur != pos)
    {
      prve = cur;
      cur = cur->next;
    }
    prve->next = cur->next;
    free(pos);
    pos = NULL;
  }
  else
  {
    *pphead = pos->next;
    free(pos);
    pos = NULL;
  }
}
//空间释放
void SLDestroy(SLNode** pphead)
{
  assert(*pphead);
  SLNode* cur = *pphead;
  while (cur)
  {
    SLNode* tmp = cur->next;
    free(cur);
    cur = tmp;//cur=cur->next
  }
}

最近改bug改的想砸电脑,保持冷静。下篇博客我们将继续链表其他类型。好好学习,天天向上。

代码---------→【唐棣棣 (TSQXG) - Gitee.com

联系---------→【邮箱:2784139418@qq.com】

目录
相关文章
|
12月前
|
前端开发 IDE Go
One API本地开发环境搭建
本文介绍如何在本地搭建 One API 开发环境,包括安装 Go 语言和 GoLand IDE,以及如何新建项目和配置数据库信息。通过简明的步骤说明,帮助开发者快速完成基本的开发环境配置,方便进行二次开发和开源贡献。
226 2
One API本地开发环境搭建
|
Web App开发 数据管理 测试技术
自动化测试框架的搭建与实践
【8月更文挑战第1天】在软件开发的海洋中,自动化测试犹如一座灯塔,为开发团队指引方向,确保代码质量。本文将深入探讨如何搭建一套高效的自动化测试框架,并通过实际案例,揭示其在项目中的应用价值。我们将从框架设计原则出发,逐步实现一个简易的自动化测试框架,并分享实践中的经验和教训,帮助读者理解自动化测试的核心理念及其在真实世界的应用。
|
Kubernetes 关系型数据库 容器
阿里云ACK产品评测
阿里云 ACK (Alibaba Cloud Container Service for Kubernetes) 是一站式容器管理服务,简化容器应用部署、管理及运维。具备友好Web界面与CLI工具;无缝集成阿里云RDS、SLB、OSS等服务;提供RBAC、网络策略及镜像安全扫描等功能确保安全;基于阿里云基础设施,支持自动伸缩与负载均衡保证高性能。通过部署WordPress案例演示具体流程,包括集群创建、kubectl配置及WordPress+MySQL部署。ACK适合各类用户,高效便捷。注意:官方镜像可能拉取失败,建议使用阿里云ECS拉取或上传至容器镜像服务。
434 0
|
缓存 监控 安全
java线程池实现和线程池七大参数详解
我们知道创建线程需要时间和空间。如果使用一次就不在使用,会等待 young GC 回收。当有大量的异步任务时,创建大量线程对象,消耗了时间和堆空间,会导致eden区 更早触发young gc,进一步降低效率。
352 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
606 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
969 110