首页 > 其他分享 >数据结构-->链表_02

数据结构-->链表_02

时间:2023-03-18 18:32:58浏览次数:38  
标签:pphead 02 SLTNode -- void pos next 链表 plist

本期的链表继续进行,上期我们完成了链表的增加和删除。

现在接下来,我们进行链表的查改与优化

头文件“SList.h”

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

typedef int SLTDataType;

typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;

}SLTNode;

//打印
void SLTPrint(SLTNode* phead);

//开辟空间
SLTNode* SLT_BUY(SLTDataType x);

//尾插数据
void SLTPushBack(SLTNode** pphead, SLTDataType x);

//尾删数据
void SLTPopBack(SLTNode** pphead);

//头插数据
void SLTPushFront(SLTNode** pphead, SLTDataType x);

//头删数据
void SLTPopFront(SLTNode** pphead);

//查找指定数值
SLTNode* SLT_FIND(SLTNode** pphead, SLTDataType x);

//删除数据
void SLTErase(SLTNode** pphead, SLTNode* pos);

测试环节“Test.c”

#include "SList.h"

void test_01()
{
SLTNode* plist = NULL; //由于一个链表单元只存储一个数值,因此直接初始化即可
//而顺训表有多个变量,比如,sz, capcity需要进行初始化,因此需要分装一个初始化函数

SLTPushBack(&plist, 21);
SLTPushBack(&plist, 23);
SLTPushBack(&plist, 25);
SLTPushBack(&plist, 27);
SLTPushBack(&plist, 29); //尾插数据

SLTPrint(plist);

SLTNode* ret = SLT_FIND(&plist, 25);
SLTErase(&plist, ret); //指定数据25进行删除

SLTPrint(plist);
}

int main()
{
test_01();
}

优化实现环节“SList.c”

#include "SList.h"

//打印
void SLTPrint(SLTNode* phead)
{
SLTNode* cur = phead;
while(cur)
{
printf("%d->", cur ->data);
cur = cur ->next;
}
printf("NULL\n");
}

//开辟空间
SLTNode* SLT_BUY(SLTDataType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if(newnode == NULL)
{
perror("malloc::fail");
return NULL;
}
newnode ->data = x;
newnode ->next = NULL; //防止野指针乱窜
return newnode;

}

//尾插数据
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
//开辟空间
SLTNode* newnode = SLT_BUY(x);
if(*pphead == NULL)
{
*pphead = newnode;
}
else
{
SLTNode* tail = *pphead;
while(tail != NULL)
{
tail = tail ->next;
}
tail = newnode;
}
}

//头插数据
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
SLTNode* newnode = SLT_BUY(x);
newnode ->next = *pphead;
*pphead = newnode;
}

//尾删数据
void SLTPopBack(SLTNode** pphead)
{
assert(pphead);
assert(*pphead);

//1.只有一个节点
//2.有两个及多个节点
if(*pphead == NULL)
{
free(*pphead);
*pphead = NULL;
}
else
{
SLTNode* tail = *pphead;
SLTNode* prev = NULL;
while(tail ->next != NULL)
{
prev = tail;
tail = tail ->next;
}
free(tail);
tail = NULL;
prev ->next = NULL; //防止野指针乱窜
}
}

//头删数据
void SLTPopFront(SLTNode** pphead)
{
SLTNode* first = *pphead;
*pphead = first ->next; //运用了值覆盖原理
free(first);
first = NULL; //防止野指针乱窜
}


//查找指定数值
SLTNode* SLT_FIND(SLTNode** pphead, SLTDataType x)
{
assert(pphead);
assert(*pphead);
SLTNode* cur = *pphead;
while(cur)
{
if(cur -> data == x)
{
return cur;
}
cur = cur ->next;
}
return NULL;
}


//删除数据
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
assert(pphead);
assert(*pphead);

if(*pphead == pos)
{
SLTPopFront(pphead);
}

else
{
SLTNode* prev = *pphead;
while(prev ->next != pos)
{
prev = prev ->next;
}
prev ->next = pos ->next;
free(pos);
}
}

下面是优化后的指定删除的运行结果 :>

数据结构-->链表_02_链表优化与测试

下面再进一步完善

1.在指定位置pos之前进行插入数据

//在pos之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
assert(pphead);
assert(*pphead);
if(*pphead == pos)
{
SLTPushFront(pphead, x);
}
else
{
SLTNode* prev = *pphead;
SLTNode* newnode = SLT_BUY(x);
while(prev ->next != pos)
{
prev = prev ->next;
}
prev ->next = newnode;
newnode ->next = pos;
}
}

2.在指定位置pos之后进行插入数据

//在pos之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
SLTNode* newnode = SLT_BUY(x);
newnode ->next = pos ->next;
pos ->next = newnode;
}

3.在指定位置pos之后进行删除数据

//在pos位置之后进行删除
void SLTEraseAfter(SLTNode* pos)
{
SLTNode* del = pos ->next;
pos ->next = del ->next;
free(del);
del = NULL;
}

现在补充头文件“SList.h”

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

typedef int SLTDataType;

typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;

}SLTNode;

//打印
void SLTPrint(SLTNode* phead);

//开辟空间
SLTNode* SLT_BUY(SLTDataType x);

//尾插数据
void SLTPushBack(SLTNode** pphead, SLTDataType x);

//尾删数据
void SLTPopBack(SLTNode** pphead);

//头插数据
void SLTPushFront(SLTNode** pphead, SLTDataType x);

//头删数据
void SLTPopFront(SLTNode** pphead);

//查找指定数值
SLTNode* SLT_FIND(SLTNode** pphead, SLTDataType x);

//删除数据
void SLTErase(SLTNode** pphead, SLTNode* pos);

//在pos之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDataType x);

//在pos之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);

//在pos位置之后进行删除
void SLTEraseAfter(SLTNode* pos);

现在进入测试环节“Test.c”

---->pos之前插数据 :>

#include "SList.h"

void test_02()
{
SLTNode* plist = NULL; //由于一个链表单元只存储一个数值,因此直接初始化即可
//而顺训表有多个变量,比如,sz, capcity需要进行初始化,因此需要分装一个初始化函数

SLTPushBack(&plist, 31);
SLTPushBack(&plist, 33);
SLTPushBack(&plist, 35);
SLTPushBack(&plist, 37);
SLTPushBack(&plist, 39); //尾插数据

SLTPrint(plist);

SLTNode* ret = SLT_FIND(&plist, 39);
SLTInsertBefore(&plist, ret, 38); //在39之前进行插入数据38

SLTPrint(plist);
}

int main()
{
test_02();
}

测试运行结果 :>

数据结构-->链表_02_链表优化与测试_02


---->pos之后插数据 :>

#include "SList.h"

void test_03()
{
SLTNode* plist = NULL; //由于一个链表单元只存储一个数值,因此直接初始化即可
//而顺训表有多个变量,比如,sz, capcity需要进行初始化,因此需要分装一个初始化函数

SLTPushBack(&plist, 31);
SLTPushBack(&plist, 33);
SLTPushBack(&plist, 35);
SLTPushBack(&plist, 37);
SLTPushBack(&plist, 39); //尾插数据

SLTPrint(plist);

SLTNode* ret = SLT_FIND(&plist, 35);
SLTInsertAfter(ret, 36); //在指定位置35后面插入数据36

SLTPrint(plist);
}

int main()
{
test_03();
}

测试运行结果 :>

数据结构-->链表_02_链表优化与测试_03

---->pos之后删除数据 :>

#include "SList.h"

void test_05()
{
SLTNode* plist = NULL; //由于一个链表单元只存储一个数值,因此直接初始化即可
//而顺训表有多个变量,比如,sz, capcity需要进行初始化,因此需要分装一个初始化函数

SLTPushBack(&plist, 31);
SLTPushBack(&plist, 33);
SLTPushBack(&plist, 35);
SLTPushBack(&plist, 37);
SLTPushBack(&plist, 39); //尾插数据

SLTPrint(plist);

SLTNode* ret = SLT_FIND(&plist, 31);
SLTInsertAfter(ret); //在指定位置31后面删除数据33

SLTPrint(plist);
}

int main()
{
test_05();
}

​测试运行结果 :>

数据结构-->链表_02_链表优化与测试_04

本期链表的增删查改及其优化测试就已经结束了!!

下一期,会对本文中链表的一些代码进行解读和分析!!

感谢小伙伴们的阅读!!

标签:pphead,02,SLTNode,--,void,pos,next,链表,plist
From: https://blog.51cto.com/u_15808800/6129746

相关文章

  • 大型买返商城交易返利抢购小程序app定制开发h5源码二开搭建
    一.注册和登录1.可以通过手机验证码注册,也可以账号密码登录2.登录或者注册,须同意商家的协议或者规则二.主页面1.主界面分四个部分,分别是广告窗口,菜单栏,活动页面,商品展示三.......
  • K8S 证书到期解决方法
    前戏登录测试环境查看pod时保持如下内容Unabletoconnecttotheserver:x509:certificatehasexpiredorisnotyetvalid:currenttime2023-03-16T23:18:09+08:0......
  • 免登录积分商城兑换热门排行会员小程序app源码包售后二开
    一首页1.商品分类;根据商品的分类,可以更快找出心仪的商品2.广告窗口;广告轮播3.活动页面;显示当前的活动,活动时间活动内容,快捷进入活动页面4.商品展示;展示现有商品二疯狂排行1.......
  • 圈子社团交友分享日常h5软件小程序定制开发源码二开
    搜索和关注自己喜欢的内容,点击上方的搜索框输入关键词或者关键语句对内容进行检索,找到对应的视频点击就可以看到。新用户登陆客户端需要使用账号和密码登陆,点击下方的用户注......
  • sprintf和sscanf的使用
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structstu{intage;charname[1024];};intmain(){structstust={25,"LiMing"};structstust1={0}......
  • PentestLab-web安全SQL注入-EXP6
    我们打开靶机,选择“SQL Injections”选择“Example6”观察页面我们使用工具测试参数为-u"http://192.168.29.148/sqli/example6.php?id=2"--dumpall开始测试没有发现我......
  • IDEA社区版找不到SpringAssistant插件下载的解决办法
    进入JetBrains的官方网站搜索插件网址如下https://plugins.jetbrains.com/plugin/10229-spring-assistant/versions/stable打开IntelliJ文件夹,将下载所得内容解压缩到如下......
  • 深入浅出QPS、RT和最佳线程数
    1什么是QPS:QPS是每秒钟处理完请求的次数。这里的请求不是指一个查询或者数据库查询,是包括一个业务逻辑的整个流程,也就是说每秒钟响应的请求次数。2什么是响应时间(RT):......
  • 每日总结--2023/3/17
    课程:计算机网络概率论web学习内容:完成了一个个人介绍的web页面及实验报告继续学习了数据链路层的相关内容完成了每日打卡app记录时间的功能 ......
  • 在Eclipse中,当移动鼠标悬停到一些标签时标签名会暂时消失?
    刚开始使用eclipse软件学习Java时,发现它的工具栏的图标实在是太小了,怎么解决呢?你开始打开浏览器,在搜索栏中敲入“eclipse的工具栏的图标太小怎么办?”,你浏览了很多的方法,突......