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

数据结构-->链表_01

时间:2023-03-18 13:32:57浏览次数:40  
标签:pphead 01 SLTNode -- void 链表 NULL plist

首次书写链表有关的知识,先来明确什么是链表?

链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的

举一个形象化的现实生活中的例子  :> 老式的绿皮火车,车厢由链条,钩子链接在了一起!!

而链表也类似,只不过,链表是通过指针的指向有次序的链接在了一起!!每一个链表可存储一个数据,并且存储着下一个链表节点的地址!!如下图所示 :>

数据结构-->链表_01_链表

由上图可以看出来,链表在逻辑上是连续的,但在物理结构上不一定连续!!

由于节点的空间,即每个数据单元是在堆上申请。而在堆上申请的空间有可能连续也有可能不连续!!

下面讲述链表的种类----->共有8种类型


如图所示 :>

数据结构-->链表_01_链表_02

数据结构-->链表_01_链表_03

而我们这里主要研究两种常用类型 :>

------------无头单向不循环-------------带头双向循环------------

1.无头单向不循环 :> 

结构简单,一般作为其他数据结构的子结构,如,哈系桶,图的链接表等等。另外笔试面试中出现较多!!

2.带头双向循环 :>

结构复杂,常用来单独存储数据。实际中使用的链表数据结构都是带头双向循环链表。另外,此种链表虽然结构复杂,但会带来很多的优势,实现反而简单了!!

好的!!下面让我们开始今天的无头单向不循环链表

头文件“SList.h”

初步创建

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

typedef int SLTDataType;

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

}SLTNode;

测试环节“Test.c”

#include "SList.h"

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

SLTPushBack(&plist, 1);
SLTPushBack(&plist, 3);
SLTPushBack(&plist, 5);
SLTPushBack(&plist, 7);
SLTPushBack(&plist, 9); //尾插数据

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; //防止野指针乱窜
}


头文件“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);

测试环节“Test.c”

----->尾插尾删数据

#include "SList.h"

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

SLTPushFront(&plist, 1);
SLTPushFront(&plist, 3);
SLTPushFront(&plist, 5);
SLTPushFront(&plist, 7);
SLTPushFront(&plist, 9); //尾插数据

SLTPrint(plist);

SLTPopFront(&plist);
SLTPopFront(&plist); //尾删数据

SLTPrint(plist);

}

int main()
{
test_01();
}

下面是执行尾插尾删的运行结果 :>

数据结构-->链表_01_链表_04


测试环节“Test.c”

----->头插头删数据

#include "SList.h"

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

SLTPushBack(&plist, 11);
SLTPushBack(&plist, 13);
SLTPushBack(&plist, 15);
SLTPushBack(&plist, 17);
SLTPushBack(&plist, 19); //头插数据

SLTPrint(plist);

SLTPopBack(&plist);
SLTPopBack(&plist); //头删数据

SLTPrint(plist);

}

int main()
{
test_02();
}

下面是执行头插头删的运行结果 :>

数据结构-->链表_01_链表_05

本期的链表就到这里了!!感谢阅读!!












标签:pphead,01,SLTNode,--,void,链表,NULL,plist
From: https://blog.51cto.com/u_15808800/6129635

相关文章

  • 三天吃透Spring Cloud面试八股文
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招......
  • 数据库表操作
    1.创建表格式create table《表名》《列名》《数据类型》《列级完整性约束定义》【表级完整性约束定义】create tablesc(sno char(7) notnull,cnochar(6)notn......
  • 开启vmware虚拟机相关服务
    一、编写.bat脚本我的脚本是start_vmware.bat 结尾一定要是.bat@echooffnetstart"VMwareHostd"netstart"VMnetDHCP"netstart"VMwareNATService"::改成自己的VM......
  • 【230318-1】若6^x+6^y=42,x+y=3. 求:xy=?
    ......
  • 随机抽取四张牌,并打印出来---Java
    packagepractice.people.apple;importjava.util.Random;publicclassDeckOfCards{publicstaticvoidmain(String[]args){intdeck[]=newint[52];Strin......
  • C++ class struct
    classandstruct目录前文问题对象与引用引用的传递对象copyshallowcopydepthcopymemcpy(data,a.data,sizeof(T)*n);简单类型复杂类型指针类型的......
  • docker仓库
    Harbor - 企业级 Docker 私有仓库一 、安装底层需求  Python应该是2.7或更高版本  Docker引擎应为1.10或更高版本  DockerCompose需要为1.6.0或更高版本......
  • axios
    axiosaxios可以局部导入和全局导入首先要下载axios插件全局导入当把axios挂载到mainjs中,就是全局了,在其他的组件中就不需要再导入了①main.js导入axiosimportaxios......
  • 0008 ALGO999-数的潜能
    试题算法训练数的潜能可以转换为将数分解为多少个3,再处理余数即可。为什么不分解为2,因为23=8<9=32。加上较小值得处理,输入值\(\le4\)时,直接输出即可。......
  • Windows Server 2016自建安装IIS
    WindowsServer2016自建安装IIS步骤1.远程连接服务器,在“桌面”>“开始”>“服务器管理器”,打开“服务器管理器”。2.在“服务器管理器”中,点击“管理”>“添......