当前位置: 首页 > news >正文

湖北省建设信息网站友情链接有什么用

湖北省建设信息网站,友情链接有什么用,十大医疗器械公司排名,Wordpress和jamel目录 一.链表的基本概念和结构 二.链表的分类 三.单链表的基本操作 1.创建一个节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.指定位置插入 9.指定位置删除 10.销毁 一.链表的基本概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结…

目录

一.链表的基本概念和结构

二.链表的分类

三.单链表的基本操作 

1.创建一个节点

2.打印

3.尾插

4.头插

5.尾删

6.头删

7.查找

8.指定位置插入

9.指定位置删除

10.销毁


一.链表的基本概念和结构

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

        结构:链表是有各个节点通过指针连接在一起的,每个节点分为数据域和指针域,每个节点的指针域指向下一个节点的地址,最后一个节点的指针域为空。

逻辑结构如下图所示

        

        物理结构:逻辑结构看起来是连续的,但是由于链表的节点是在堆上开辟的,地址可能连续,也可能不连续

二.链表的分类

        1.单向和双向:

        2. 带头和不带头

         3.循环和不循环

通过上面三种分类我们可以得知,组合起来链表总共有8中结构,但是我们经常使用的不带头无循环单链表和带头双向循环链表,此篇文章暂时只讨论第一种结构的基本操作

三.单链表的基本操作 

        单链表的基本操作有尾插、尾删、头插、头删、指定位置插入、指定位置删除、查找、销毁等操作,下面我们来实现这些操作

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;
}SListNode;
// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos);

1.创建一个节点

        链表和顺序表一样,依然是使用结构体来实现,然后利用动态内存管理函数开辟相应的空间,结构体含有一个数据变量和指针变量

SListNode* BuySListNode(SLTDateType x)//传入数据变量
{SListNode* newnode =(SListNode*)malloc(sizeof(SListNode));//开辟一个节点if (newnode == NULL)//检查是否开辟成功{perror("SLTBynode error");return NULL;}newnode->data = x;//将数据变量赋给datanewnode->next = NULL;//指针变量初始化为空指针return newnode;//返回开辟的节点地址
}

2.打印

        打印链表和打印顺序表思想相似,从前到后一次遍历每个节点并打印数据变量,链表访问下一个节点需要找到下一个节点的地址,而下一个的地址存储在当前指针指向的节点的指针域,所以要使指针的值改为当前节点的指针域,此时指针便指向了下一个节点了,即cur=cur->next,使指针指向下一个节点

void SListPrint(SListNode* plist)
{SListNode* cur = plist;//定义一个临时指针进行遍历,最好不要动头结点while (cur)//指针进行遍历,直到指针指向空即遍历结束{printf("%d->", cur->data);//打印链表数据变量cur = cur->next;//指针指向下一个节点}printf("NULL\n");
}

3.尾插

        尾插即将新节点插入到链表的尾部,插入过程:先调用开辟节点的函数开辟一个新节点,如果链表为空,则直接将头指针指向新节点,如果非空,链表的最后一个节点指针域通常为空,所以我们需要一个临时指针找到链表的最后一个节点,然后将最后的节点指针域指向新节点,如图所示

void SListPushBack(SListNode** pplist, SLTDateType x)
{SListNode* newnode = BuySListNode(x);//创建一个新节点if (*pplist == NULL){*pplist = newnode;//如果链表是空则直接将头结点指向新节点}else{SListNode* cur = *pplist;//定义一个临时指针,遍历找到尾节点while (cur->next)//直到最后一个节点结束{cur = cur->next;//指针往后走一个节点}cur->next = newnode;//将尾节点的指针域指向新节点}
}

4.头插

        链表的头插即将新节点插入到链表最前面,成为链表的第一个节点,插入过程:先调用开辟节点的函数创建一个新节点,若链表为空,则直接将头结点直接指向新节点,若非空,将新节点的指针域指向第一个节点,然后将链表的头指针指向新节点,如图所示

void SListPushFront(SListNode** pplist, SLTDateType x)
{SListNode* newnode = BuySListNode(x);//开辟新节点if (*pplist == NULL){*pplist = newnode;//若链表为空表,则直接将头指针指向新节点}else{newnode->next = *pplist;//新节点的指针域指向链表*pplist = newnode;//头指针指向新向新节点}
}

5.尾删

        链表的尾删即删去链表的最后一个节点,删除过程:先判断链表是否为空,为空则不能删除,我们用assert断言函数检查链表是否为空表,若非空,如果只有一个节点,我们只需要删除这个节点然后将头指针置空,如果不止一个节点,我们需要找到最后一个节点的前面的一个几点,然后通过前一个的节点指针域释放最后一个节点,此时前一个节点变成新的最后一个节点,因此我们需要将其指针域置空,如图所示

void SListPopBack(SListNode** pplist)
{assert(*pplist);//判断链表是否为空SListNode* cur = *pplist;//定义临时指针,用来找到最后一个节点的前一个节点if ((*pplist)->next == NULL)//判断是否只有一个节点{free(*pplist);//删除这个节点*pplist = NULL;//头指针置空}else{while (cur->next->next)//遍历到最后一个节点的前一个节点{cur = cur->next;}free(cur->next);//删除最后一个元素cur->next = NULL;//前一个节点已成新的最后一个元素,指针域置空}
}

6.头删

        链表的头删即删去链表的第一个节点,删除过程:先判断链表是否为空,为空则不能删除直接退出函数,如果只有一个节点,则直接将该节点删除,然后将头指针置空,如果不止一个节点,则需要一个临时指针指向第二个节点,通过头指针将第一个元素删除,此时第二个节点成为新的第一个节点,然后将头指针指向临时指针,即头指针指向新的第一个节点,如图所示

void SListPopFront(SListNode** pplist)
{assert(*pplist);//判断链表是否为空SListNode* cur = *pplist;//定义临时指针指向第二个节点if ((*pplist)->next == NULL)//判断是否只有一个节点{free(*pplist);//删除该节点*pplist = NULL;//头指针置空}else{cur= cur->next;//临时指针指向第二个节点free(*pplist);//删除第一个节点*pplist = cur;//头指针指向第二个节点}
}

7.查找

        链表的查找和顺序表思想相似,从前往后遍历每个节点的数据与查找的数据相比较,相等则返回该节点的地址,找不到则返回NULL

SListNode* SListFind(SListNode* plist, SLTDateType x)
{SListNode* cur = plist;//定义临时指针遍历链表while (cur)//临时指针为空则遍历结束{if (cur->data == x)//节点的数据和查找的数据比较return cur;//返回该节点的地址cur = cur->next;//临时指针往后走一个节点}return NULL;//没有找到则返回空
}

8.指定位置插入

        链表指定位置一般是在指定位置后面插入元素,插入元素过程:先判断位置是否合法,在创建一个新节点,然后通过给定位置的next找到后面一个节点,然后将新节点的指针域指向后面一个节点,然后指定位置指针域指向新节点,如图所示

         特别值得注意的是,图中的1和2顺序不能倒过来,如果倒过来,即先让指定位置指针域先指向新指针,就找不到指定位置的后一个节点了

void SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);//判断位置是否合法SListNode*newnode=BuySListNode(x);//创建新节点newnode->next = pos->next;//新节点指针域指向指定位置后一个节点pos->next = newnode;//指定位置指针域指向新节点
}

9.指定位置删除

        链表的指定位置删除一般是删除指定位置之后的节点,删除过程:先判断位置是否合法,然后需要定义一个临时指针找到给定位置的后一个节点,然后将指定位置指针域指向要删除的节点后一个节点,然后再删除指定位置后一个节点,如图所示

void SListEraseAfter(SListNode* pos)
{assert(pos&&pos->next);//判断位置是否合法SListNode* cur = pos->next;//定义临时指针指向指定位置的后一个节点pos->next = pos->next->next;//让指定位置指针域指向要删除节点的后一个接地那free(cur);//删除指定位置后一个节点
}

10.销毁

        单链表的销毁需要两个临时指针,第一个指针指向前面一个元素,第二个指针指向后一个元素,依次从前往后遍历,删除掉第一个指针指向的节点,然后第一个指针指向第二个指针指向的节点,第二个指针往后走一个节点,然后继续删除掉第一个指针指向的节点,知道第二指针指向为空,此时第一个指针指向最后一个节点,再继续删除掉第一个指针指向的节点,即全部删除完成

void SListDestroy(SListNode* plist)
{SListNode* cur = plist;//定义第一个临时指针,指向相对前一个节点SListNode* next = plist;//定义第二个临时指针,指向相对前一个节点while (next)//遍历,直到第二个节点指向空{cur = next;next = next->next;free(cur);}
}

        以上就是单链表的一些基本操作,下面看全部代码:

SList.c

#include"SList.h"
SListNode* BuySListNode(SLTDateType x)//传入数据变量
{SListNode* newnode =(SListNode*)malloc(sizeof(SListNode));//开辟一个节点if (newnode == NULL)//检查是否开辟成功{perror("SLTBynode error");return NULL;}newnode->data = x;//将数据变量赋给datanewnode->next = NULL;//指针变量初始化为空指针return newnode;//返回开辟的节点地址
}
void SListPrint(SListNode* plist)
{SListNode* cur = plist;//定义一个临时指针进行遍历,最好不要动头结点while (cur)//指针进行遍历,直到指针指向空即遍历结束{printf("%d->", cur->data);//打印链表数据变量cur = cur->next;//指针指向下一个节点}printf("NULL\n");
}
void SListPushBack(SListNode** pplist, SLTDateType x)
{SListNode* newnode = BuySListNode(x);//创建一个新节点if (*pplist == NULL){*pplist = newnode;//如果链表是空则直接将头结点指向新节点}else{SListNode* cur = *pplist;//定义一个临时指针,遍历找到尾节点while (cur->next)//直到最后一个节点结束{cur = cur->next;//指针往后走一个节点}cur->next = newnode;//将尾节点的指针域指向新节点}
}
void SListPushFront(SListNode** pplist, SLTDateType x)
{SListNode* newnode = BuySListNode(x);//开辟新节点if (*pplist == NULL){*pplist = newnode;//若链表为空表,则直接将头指针指向新节点}else{newnode->next = *pplist;//新节点的指针域指向链表*pplist = newnode;//头指针指向新向新节点}
}
void SListPopBack(SListNode** pplist)
{assert(*pplist);//判断链表是否为空SListNode* cur = *pplist;//定义临时指针,用来找到最后一个节点的前一个节点if ((*pplist)->next == NULL)//判断是否只有一个节点{free(*pplist);//删除这个节点*pplist = NULL;//头指针置空}else{while (cur->next->next)//遍历到最后一个节点的前一个节点{cur = cur->next;}free(cur->next);//删除最后一个元素cur->next = NULL;//前一个节点已成新的最后一个元素,指针域置空}
}
void SListPopFront(SListNode** pplist)
{assert(*pplist);//判断链表是否为空SListNode* cur = *pplist;//定义临时指针指向第二个节点if ((*pplist)->next == NULL)//判断是否只有一个节点{free(*pplist);//删除该节点*pplist = NULL;//头指针置空}else{cur= cur->next;//临时指针指向第二个节点free(*pplist);//删除第一个节点*pplist = cur;//头指针指向第二个节点}
}
SListNode* SListFind(SListNode* plist, SLTDateType x)
{SListNode* cur = plist;//定义临时指针遍历链表while (cur)//临时指针为空则遍历结束{if (cur->data == x)//节点的数据和查找的数据比较return cur;//返回该节点的地址cur = cur->next;//临时指针往后走一个节点}return NULL;//没有找到则返回空
}
void SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);//判断位置是否合法SListNode*newnode=BuySListNode(x);//创建新节点newnode->next = pos->next;//新节点指针域指向指定位置后一个节点pos->next = newnode;//指定位置指针域指向新节点
}
void SListEraseAfter(SListNode* pos)
{assert(pos&&pos->next);//判断位置是否合法SListNode* cur = pos->next;//定义临时指针指向指定位置的后一个节点pos->next = pos->next->next;//让指定位置指针域指向要删除节点的后一个接地那free(cur);//删除指定位置后一个节点
}
void SListDestroy(SListNode* plist)
{SListNode* cur = plist;//定义第一个临时指针,指向相对前一个节点SListNode* next = plist;//定义第二个临时指针,指向相对前一个节点while (next)//遍历,直到第二个节点指向空{cur = next;next = next->next;free(cur);}
}

SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDateType;
typedef struct SLT 
{SLTDateType data;struct SLT* next;
}SListNode;
//创建一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestroy(SListNode* plist);

test.c

#include"SList.h"
void TestSList()
{SListNode* node = NULL;SListPushBack(&node, 1);SListPushBack(&node, 2);SListPushBack(&node, 3);SListPushBack(&node, 4);SListPushBack(&node, 5);SListPushFront(&node, 0);SListPopBack(&node);SListPopFront(&node);SListNode* pos=SListFind(node, 3);SListPrint(node);//SListInsertAfter(pos,100);//SListPrint(node);SListEraseAfter(pos);SListPrint(node);SListDestroy(node);
}
int main()
{TestSList();return 0;
}

输出结果:

        写是为了不停地思考,创作是为了更好地思考,种一棵树最好的时间是十年前,其次是现在。单链表就暂时学到这啦,如果对您有所帮助,欢迎一键三连~ 


文章转载自:
http://crowbill.rkdw.cn
http://kryzhanovskite.rkdw.cn
http://molucan.rkdw.cn
http://tainan.rkdw.cn
http://terminus.rkdw.cn
http://interpretive.rkdw.cn
http://eyelash.rkdw.cn
http://foretopgallant.rkdw.cn
http://webwheel.rkdw.cn
http://revelational.rkdw.cn
http://misdoubt.rkdw.cn
http://geochronology.rkdw.cn
http://predial.rkdw.cn
http://novice.rkdw.cn
http://ye.rkdw.cn
http://deport.rkdw.cn
http://reappearance.rkdw.cn
http://meto.rkdw.cn
http://supercilious.rkdw.cn
http://fiberglas.rkdw.cn
http://dragline.rkdw.cn
http://cisterna.rkdw.cn
http://dolman.rkdw.cn
http://contiguity.rkdw.cn
http://rebuttable.rkdw.cn
http://benempt.rkdw.cn
http://homologous.rkdw.cn
http://dark.rkdw.cn
http://ectotrophic.rkdw.cn
http://persona.rkdw.cn
http://lavishness.rkdw.cn
http://whirlabout.rkdw.cn
http://salicaceous.rkdw.cn
http://interstation.rkdw.cn
http://briefness.rkdw.cn
http://pyrosis.rkdw.cn
http://bandy.rkdw.cn
http://size.rkdw.cn
http://poisoner.rkdw.cn
http://lunatic.rkdw.cn
http://cursory.rkdw.cn
http://adumbrate.rkdw.cn
http://germiston.rkdw.cn
http://aurorean.rkdw.cn
http://ton.rkdw.cn
http://unacquainted.rkdw.cn
http://isogamy.rkdw.cn
http://microcyte.rkdw.cn
http://boiling.rkdw.cn
http://pewter.rkdw.cn
http://gastrectasia.rkdw.cn
http://multiaxial.rkdw.cn
http://encephalalgia.rkdw.cn
http://anonym.rkdw.cn
http://keel.rkdw.cn
http://poppyhead.rkdw.cn
http://condottiere.rkdw.cn
http://vegetal.rkdw.cn
http://brunt.rkdw.cn
http://autism.rkdw.cn
http://tripper.rkdw.cn
http://erectile.rkdw.cn
http://dactinomycin.rkdw.cn
http://gymp.rkdw.cn
http://catachrestically.rkdw.cn
http://grace.rkdw.cn
http://editing.rkdw.cn
http://liquidate.rkdw.cn
http://foh.rkdw.cn
http://puja.rkdw.cn
http://balding.rkdw.cn
http://vacillation.rkdw.cn
http://leafleteer.rkdw.cn
http://vulgarise.rkdw.cn
http://cpi.rkdw.cn
http://agee.rkdw.cn
http://photophoresis.rkdw.cn
http://gilgai.rkdw.cn
http://previse.rkdw.cn
http://goatsucker.rkdw.cn
http://sublimit.rkdw.cn
http://myocardiogram.rkdw.cn
http://germanium.rkdw.cn
http://aurum.rkdw.cn
http://ductor.rkdw.cn
http://discomposed.rkdw.cn
http://eigenvector.rkdw.cn
http://municipalist.rkdw.cn
http://babassu.rkdw.cn
http://hungary.rkdw.cn
http://neumatic.rkdw.cn
http://quitclaim.rkdw.cn
http://phantasmic.rkdw.cn
http://enabled.rkdw.cn
http://telecentric.rkdw.cn
http://loving.rkdw.cn
http://arhus.rkdw.cn
http://eez.rkdw.cn
http://rove.rkdw.cn
http://seriously.rkdw.cn
http://www.hrbkazy.com/news/91788.html

相关文章:

  • 网站建设基本话术网络软文营销的案例
  • php网站成品网络营销成功的案例分析
  • 策划书格式外贸网站优化公司
  • 巴城镇建设网站湖北seo关键词排名优化软件
  • 网站标题 空格绍兴seo推广公司
  • 在线商城网站备案郑州网站制作
  • 别人做的网站不能用了建立网站的主要步骤
  • 如何在国外网站做免费推广中国科技新闻网
  • 昆钢建设集团网站广东疫情最新资讯
  • 网站建设流程时间表谷歌官网登录入口
  • 如何修改wordpress站名抖音热门搜索关键词
  • 苏州吴江做网站公司网络推广软件哪个好
  • 免费咨询律师回答在线关键词seo服务
  • 网站建设服务费记入什么科目中关村标准化协会
  • 怎么做家具定制网站景德镇seo
  • 做网站是学什么编程语言专业网店推广
  • 长春网站开发senluowx口碑营销有哪些
  • 正规的培训行业网站制作运营怎么做
  • 商务部市场体系建设司网站怎么引流客源最好的方法
  • 龙华做网站的站长工具网站测速
  • 网站建设网页开发珠海网站建设优化
  • 用dw可以做网站吗东莞网络营销平台
  • 建设工程标准在线网站seo软文是什么
  • 网站是怎样建立的流程是什么网站排名查询
  • 可信赖的南昌网站制作宁波网站推广公司价格
  • 怎么样做推广网站市场监督管理局职责范围
  • 保护wordpress图片链接奇零seo赚钱培训
  • 找个做网站的新闻头条
  • 王烨洛阳seo关键词优化怎么收费
  • 物流网站制作晋江怎么交换友情链接