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

下沙网站建设中国建站公司

下沙网站建设,中国建站公司,德阳建设银行招聘网站,网新科技集团有限公司官网目录 1.查找数据 2.指定位置插入和删除节点 2.1 指定位置之前插入节点 2.2 指定位置之后插入节点 2.3 删除指定位置节点 2.4 删除指定位置之后的节点 3.销毁链表 我们接着上一篇【数据结构】单链表#xff08;一#xff09;-CSDN博客 来继续实现单链表 1.查找数据 在…目录 1.查找数据 2.指定位置插入和删除节点 2.1 指定位置之前插入节点 2.2 指定位置之后插入节点 2.3 删除指定位置节点 2.4 删除指定位置之后的节点 3.销毁链表 我们接着上一篇【数据结构】单链表一-CSDN博客 来继续实现单链表 1.查找数据 在SList.h中进行函数的声明 SLNode* SLfind(SLNode* pps, Type x);//查找 返回值是一个地址如果找到就返回这个数的地址如果没找到就返回NULL参数就是链表首节点地址和要查找的数 在SList.c中进行函数的实现 首先我们可以再定义一个指针存放首节点地址这样的话在后面的遍历链表时就不会改变pps的指向了 SLNode* SLfind(SLNode* pps, Type x)//查找 {SLNode* pcur pps;//新定义一个指针指向首节点 } 然后就是循环遍历 SLNode* SLfind(SLNode* pps, Type x)//查找 {SLNode* pcur pps;//新定义一个指针指向首节点while (pcur)//pcur不能为空{if (pcur-data x) //找到return pcur;//直接返回地址pcur pcur-next;//没找到往后找} } 当跳出while循环时证明没找到此时pcur为空我们直接返回NULL SLNode* SLfind(SLNode* pps, Type x)//查找 {SLNode* pcur pps;//新定义一个指针指向首节点while (pcur)//pcur不能为空{if (pcur-data x) //找到return pcur;//直接返回地址pcur pcur-next;//没找到往后找}return NULL;//没找到 } 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLNode* find SLfind(plist, 2);if (find NULL)printf(没找到\n);elseprintf(找到了\n); } int main() {//SListtest1();//SListtest2();SListtest3();return 0; } 自己测试的时候可以多测几次 2.指定位置插入和删除节点 上一篇我们说了头部尾部的插入和删除数据现在我们来实现一下指定位置的插入和删除数据 2.1 指定位置之前插入节点 在SList.h中进行函数的声明 void SLInsert(SLNode** pps, SLNode* pos, Type x);//指定之前插 参数有三个链表首节点的地址指定的位置要插入的数据 在SList.c中进行函数的实现 现在我们要在节点3前面插入一个节点就要让节点2里面的next指向新节点新节点里面的next指向节点3 我们先找pos的前一个结点 用循环遍历 void SLInsert(SLNode** pps, SLNode* pos, Type x)//指定之前插 {assert(pps *pps);assert(pos);SLNode* prev *pps;//再定义一个指针变量初始指向首节点while (prev-next ! pos){prev prev-next;} } 跳出循环后此时prev指向pos前一个节点然后让这些节点“手牵手” void SLInsert(SLNode** pps, SLNode* pos, Type x)//指定之前插 {assert(pps *pps);assert(pos);SLNode* newnode SLBuyNode(x);//插入的数据SLNode* prev *pps;//再定义一个指针变量初始指向首节点while (prev-next ! pos){prev prev-next;}newnode-next pos;prev-next newnode; } 代码写到这里我们在分析一下pos为1时可不可行 这种情况下prev会一直往后走直到走到最后一个节点上面的代码在次情况下行不通 我们再分析一下pos为最后一个节点时可不可行 依旧是让节点3里面的next指向新节点新节点里面的next指向节点4 经分析上面的代码在这种情况下可行所以不可行的就是pos为1的情况我们单独把这种情况列出来其实pos为1时也就是头插的情况 void SLInsert(SLNode** pps, SLNode* pos, Type x)//指定之前插 {assert(pps *pps);assert(pos);SLNode* newnode SLBuyNode(x);//插入的数据if (pos *pps){SLPushHead(pps, x);//直接调用头插代码}else//其他位置{SLNode* prev *pps;//再定义一个指针变量初始指向首节点while (prev-next ! pos){prev prev-next;}newnode-next pos;prev-next newnode;} } 这就是完整的代码 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLNode* find SLfind(plist, 2);//找2SLInsert(plist, find, 11);//直接插在2前面SLPrint(plist);//打印 } int main() {SListtest3();return 0; } 看结果 其他情况有疑惑的话一定要自己测试运行一下 2.2 指定位置之后插入节点 在SList.h中进行函数的声明 void SLAfter(SLNode* pos, Type x);//指定之后插 这里只有两个参数一个是指定位置一个是要插入的值这里我们不需要知道头节点因为可以通过pos找到下一个节点在指定位置之前插入数据的函数需要头节点是因为我们不能通过pos找到pos的前一个节点 在SList.c中进行函数的实现 void SLAfter(SLNode* pos, Type x)//指定之后插 {assert(pos);SLNode* newnode SLBuyNode(x);//插入的数据newnode-next pos-next;pos-next newnode; } 注意  newnode-next pos-next;   pos-next newnode;这两句代码的顺序不可以交换交换后是错的 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLNode* find SLfind(plist, 2);//找2SLInsert(plist, find, 11);//直接插在2前面SLPrint(plist);//打印SLAfter(find, 5);//插在2后面SLPrint(plist);//打印 } int main() {SListtest3();return 0; } 代码没有问题 2.3 删除指定位置节点 在SList.h中进行函数的声明 void SLErase(SLNode** pps, SLNode* pos);//删除pos节点 参数是二级指针接收首节点地址还有一个参数是要删除的节点 在SList.c中进行函数的实现 我们要先让pos的前一个节点指向pos的后一个节点然后把pos这个节点销毁 既然要找pos的前一个节点我们依旧是定义一个指针prev初始为*pps往后一个一个找直到找到pos前一个节点  void SLErase(SLNode** pps, SLNode* pos)//删除pos节点 {assert(pps *pps);assert(pos);SLNode* prev *pps;while (prev-next ! pos){prev prev-next;}prev-next pos-next;free(pos);pos NULL; } 如果此时链表只有一个节点上面的代码可行吗来分析一下 发现代码走不通其实这种情况就是头删的情况我们直接调用头删的代码就可以了 void SLErase(SLNode** pps, SLNode* pos)//删除pos节点 {assert(pps *pps);assert(pos);if (pos *pps)//一个节点{SLPopHead(pps);}else//多个节点{SLNode* prev *pps;while (prev-next ! pos){prev prev-next;}prev-next pos-next;free(pos);pos NULL;} } 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLNode* find SLfind(plist, 7);//找7SLErase(plist, find);//删除指定位置节点SLPrint(plist);//打印 } int main() {SListtest3();return 0; } 删除成功 2.4 删除指定位置之后的节点 在SList.h中进行函数的声明 void SLPushAfter(SLNode* pos);//删除pos之后的节点 pos的后一个节点我们可以直接通过pos找到就不需要头节点地址所以一个参数就好了 在SList.c中进行函数的实现 还是先让pos这个节点找到它的下下个节点然后再销毁pos后面的节点 这里呢我们需要一个临时变量存放pos-next的地址然后再连接节点 我们先写一下代码让pos和pos下下个节点相连 void SLPushAfter(SLNode* pos)//删除pos之后的节点 {assert(pos);assert(pos-next);SLNode* temp pos-next;pos-next temp-next; } 然后销毁pos下一个节点并置空 void SLPushAfter(SLNode* pos)//删除pos之后的节点 {assert(pos);assert(pos-next);SLNode* temp pos-next;//临时变量pos-next temp-next;//连接free(temp);//销毁temp NULL;//置空 } 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLNode* find SLfind(plist, 7);//找7SLPushAfter(find);//删除指定位置后一个节点SLPrint(plist);//打印 } int main() {SListtest3();return 0; } 3.销毁链表 跟顺序表一样链表使用完之后也要销毁链表由一个一个节点组成所以也要一个一个销毁 在SList.h中进行函数的声明 void SLDestroy(SLNode** pps);//销毁 参数就是首节点地址 在SList.c中进行函数的实现 我们在销毁当前节点之前要把下一个节点的信息存起来 销毁空间 pcur后移到提前保存的next处 然后next后移把当前的pcur销毁 就这样一直往后直到pcur为空 代码来实现一下 void SLDestroy(SLNode** pps)//销毁 {assert(*pps pps);SLNode* pcur *pps;while (pcur){SLNode* next pcur-next;//存下节点信息free(pcur);//释放pcur next;//往后走}*pps NULL;//不要忘了头节点此时没有置空要置空 } 在test.c中测试一下 void SListtest3() {SLNode* plist NULL;//空链表SLPushBack(plist, 1);//尾插SLPushBack(plist, 2);SLPushHead(plist, 6);//头插SLPushHead(plist, 7);SLPrint(plist);//打印SLDestroy(plist);//销毁SLPrint(plist);//打印 } int main() {SListtest3();return 0; } 可以自己通过调试看结果能看到更详细打印出来看也可以 单链表实现就分享到这里拜拜~
http://www.zqtcl.cn/news/685657/

相关文章:

  • 推荐一下网站谢谢微盟微商城怎么样
  • 网站建设的技术指标网站做好第二年要多少钱
  • 工业设计东莞网站建设WordPress网络功能
  • 网站pv多少可以企业网站托管常见问题
  • 深圳有哪些网站建设沈阳做机床的公司网站
  • 2022年网站能用的wordpress 客户端使用
  • 社交网站建设内容如何制作橡皮泥 简单
  • 简述网站的制作流程wordpress定制分类
  • 如何自建购物网站wordpress文章编辑插件
  • 网站策划机构建筑网站、
  • 邹平做网站的公司标志设计图片大全简单
  • 广东省建设厅官方网站多少钱如何在虚拟机里面做网站
  • 上海免费网站建设模板做网站页面的软件
  • 做折页的网站个人网站有哪些
  • 服装网站建设内容wordpress媒体库只能列表
  • 北京好的做网站的公司东莞专业做淘宝网站
  • 网站结构怎么优化wordpress文章列表添加字段
  • 网站建设框架图长沙官网seo技术厂家
  • 电子商务网站建设主管的策划案html个人网站设计模板
  • 网站首页的head标签内做网站要学的教程
  • 网页设计教学网站江西省建设监督网站
  • 网站建设与发布需要什么提供网站制作公司哪家好
  • 西宁市城市道路建设规划网站探测器 东莞网站建设
  • 旅游村庄网站建设方案小程序制作价格
  • 网站地图制作软件机械加工网免费铺货
  • 网站上线有什么线上活动可以做龙华建网站多少钱
  • 门户网站系统开发建设电脑优化
  • 公司建网站多少钱一个月服务佳的广州网站建设
  • 怎么创建网站建设徐州网站建设要多少钱
  • 微网站功能列表菜市场做建筑设计图库的网站设计