news 2026/10/15 15:32:18

第28讲:单链表的应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第28讲:单链表的应用

目录

  1. 单链表经典算法OJ题目
    1. 单链表相关经典算法OJ题1:移除链表元素
    2. 单链表相关经典算法OJ题2:反转链表
    3. 单链表相关经典算法OJ题3:合并两个有序链表
    4. 单链表相关经典算法OJ题4:链表的中间结点
    5. 循环链表经典应用-环形链表的约瑟夫问题
    6. 单链表相关经典算法OJ题5:分割链表
  2. 基于单链表再实现通讯录项目

单链表经典算法

1. 链表经典算法OJ题目

1.1 单链表相关经典算法OJ题1:移除链表元素
1.2 单链表相关经典算法OJ题2:反转链表
1.3 单链表相关经典算法OJ题3:合并两个有序链表
1.4 单链表相关经典算法OJ题4:链表的中间结点
1.5 循环链表经典应用-环形链表的约瑟夫问题
著名的Josephus问题

据说著名犹太历史学家 Josephus 有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,每报数到第 3 人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

然而 Josephus 和他的朋友并不想遵从,Josephus 要他的朋友先假装遵从,他将朋友与自己安排在第 16 个与第 31 个位置,于是逃过了这场死亡游戏。

1.6 单链表相关经典算法OJ题5:分割链表

基于单链表再实现通讯录项目

SList.h

//SList.h//// Created by mm on 2023/6/13.//#include<stdio.h>#include<stdlib.h>#include<assert.h>#include"contact.h"typedefstructPersonInfoSLTDataType;//typedef int SLTDataType;structSListNode{structSListNode*next;SLTDataType data;}voidSLTPrint(SLTNode*phead);//头部插入删除/尾部插入删除voidSLTPushBack(SLTNode**pphead,SLTDataType x);voidSLTPushFront(SLTNode**pphead,SLTDataType x);voidSLTPopBack(SLTNode**pphead);voidSLTPopFront(SLTNode**pphead);//查找SLTNode*SLTFind(SLTNode*phead,SLTDataType x);//在指定位置之前插入数据voidSLTInsert(SLTNode**pphead,SLTNode*pos,SLTDataType x);//删除pos节点voidSLTErase(SLTNode**pphead,SLTNode*pos);//在指定位置之后插入数据voidSLTInsertAfter(SLTNode*pos,SLTDataType x);//删除pos之后的节点voidSLTEraseAfter(SLTNode*pos);//销毁链表voidSListDesTroy(SLTNode**pphead);

contact.h

//contact.h#pragmaonce#defineNAME_MAX100#defineSEX_MAX4#defineTEL_MAX11#defineADDR_MAX100//前置声明typedefstructSListNodecontact;//用户数据typedefstructPersonInfo{charname[NAME_MAX];charsex[SEX_MAX];intage;chartel[TEL_MAX];charaddr[ADDR_MAX];}PeoInfo;//初始化通讯录voidInitContact(contact**con);//实际调用的是链表的初始化接口(可以简单做一个头结点的初始化)//添加通讯录数据voidAddContact(contact**con);// 链表尾插/头插//删除通讯录数据voidDelContact(contact**con);//链表的删除指定位置的数据//展示通讯录数据voidShowContact(contact*con);//链表的打印//查找通讯录数据voidFindContact(contact*con);//修改通讯录数据voidModifyContact(contact**con);//销毁通讯录数据voidDestroyContact(contact**con);

contact.c

#define_CRT_SECURE_NO_WARNINGS#include"contact.h"#include"SList.h"voidLoadContact(contact**con){FILE*pf=fopen("contact.txt","rb");if(pf==NULL){perror("fopen error!\n");return;}//循环读取文件数据PeoInfo info;while(fread(&info,sizeof(info),1,pf)){SLTPushBack(con,info);}printf("历史数据导入通讯录成功!\n");}voidInitContact(contact**con){LoadContact(con);//把本地的通讯录数据导入到链表结构}voidAddContact(contact**con){PeoInfo info;printf("请输入姓名:\n");scanf("%s",&info.name);printf("请输入性别:\n");scanf("%s",&info.sex);printf("请输入年龄:\n");scanf("%d",&info.age);printf("请输入联系电话:\n");scanf("%s",&info.tel);printf("请输入地址:\n");scanf("%s",&info.addr);SLTPushBack(con,info);printf("插入成功!\n");}contact*FindByName(contact*con,charname[]){contact*cur=con;while(cur){if(strcmp(cur->data.name,name)==0){returncur;}cur=cur->next;}returnNULL;}voidDelContact(contact**con){charname[NAME_MAX];printf("请输入要删除的用户姓名:\n");scanf("%s",name);contact*pos=FindByName(*con,name);if(pos==NULL){printf("要删除的用户不存在,删除失败!\n");return;}SLTErase(con,pos);printf("删除成功!\n");}voidShowContact(contact*con){printf("%-10s %-4s %-4s %15s %-20s\n","姓名","性别","年龄","联系电话","地址");contact*cur=con;while(cur){printf("%-10s %-4s %-4d %15s %-20s\n",cur->data.name,cur->data.sex,cur->data.age,cur->data.tel,cur->data.addr);cur=cur->next;}}voidFindContact(contact*con){charname[NAME_MAX];printf("请输入要查找的用户姓名:\n");scanf("%s",name);contact*pos=FindByName(con,name);if(pos==NULL){printf("要查找的用户不存在,查找失败!\n");return;}printf("查找成功!\n");printf("%-10s %-4s %-4d %15s %-20s\n",pos->data.name,pos->data.sex,pos->data.age,pos->data.tel,pos->data.addr);}voidModifyContact(contact**con){charname[NAME_MAX];printf("请输入要修改的用户名称:\n");scanf("%s",&name);contact*pos=FindByName(*con,name);if(pos==NULL){printf("要查找的用户不存在,修改失败!\n");return;}printf("请输入要修改的姓名:\n");scanf("%s",pos->data.name);printf("请输入要修改的性别:\n");scanf("%s",pos->data.sex);printf("请输入要修改的年龄:\n");scanf("%d",&pos->data.age);printf("请输入要修改的联系电话:\n");scanf("%s",pos->data.tel);printf("请输入要修改的地址:\n");scanf("%s",pos->data.addr);printf("修改成功!\n");}voidSaveContact(contact*con){FILE*pf=fopen("contact.txt","wb");if(pf==NULL){perror("fopen error!\n");return;}//将通讯录数据写入文件contact*cur=con;while(cur){fwrite(&(cur->data),sizeof(cur->data),1,pf);cur=cur->next;}printf("通讯录数据保存成功!\n");}voidDestroyContact(contact**con){SaveContact(*con);//在通讯录销毁之前,先把历史数据保存到本地文件中contact.txtSListDesTroy(con);}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 15:32:13

Ubuntu 16.04 下源码编译安装 Abseil C++ 库完整指南

1. 项目概述&#xff1a;为什么在 Ubuntu 16.04 上亲手编译 abseil 不是“多此一举”abseil 是 Google 开源的一套 C 基础工具库&#xff0c;它不是那种“写个 Hello World 就够用”的玩具组件&#xff0c;而是现代 C 工程中真正扛大梁的底层基建——从高效的字符串视图&#x…

作者头像 李华
网站建设 2026/10/15 15:31:12

轻量监控工具HKmonitor实战:从部署到告警配置与排查

简介&#xff1a;HKmonitor是面向海康威视摄像头的多窗口监控客户端&#xff0c;适合需要同时查看多路实时画面并快速切换布局的安防值守人员&#xff0c;也适合 Qt 开发者借鉴界面与视频交互实现。压缩包共 226 个文件&#xff0c;包含 cpp、h、ui 等源码文件&#xff0c;dll、…

作者头像 李华
网站建设 2026/10/15 15:30:51

OrCAD PSpice 9.2 老工程仿真环境搭建与避坑指南

简介&#xff1a;OrCAD PSpice 9.2完整版安装包&#xff0c;面向电子工程师、电路设计人员及高校相关专业学生&#xff0c;用于原理图绘制、模拟/数字混合电路仿真及信号完整性分析&#xff0c;可有效解决从电路搭建到仿真验证环节的效率和准确性问题。压缩包内共包含609个文件…

作者头像 李华
网站建设 2026/10/15 15:30:43

STM32 UART Modbus RTU主机模式:从帧结构到状态机的完整落地

简介&#xff1a;面向工业自动化通信领域的嵌入式工程师&#xff0c;这份资源提供了一套基于STM32微控制器和UART串口的Modbus RTU主机模式实现方案&#xff0c;适用于需要主控多个从设备进行数据采集与控制的RS485总线场景。内容包括UART波特率、数据位、停止位及校验位的配置…

作者头像 李华
网站建设 2026/10/15 15:30:38

Unity3D串口通信调试指南:从SerialPort到避坑实战

简介&#xff1a;面向需要对接Arduino、各类传感器等外部硬件设备的Unity3D开发者&#xff0c;提供一套无需经过Java层中转、直接在C#脚本中操作Android串口的完整示例。资源覆盖了串口打开、波特率与数据位等参数配置、数据发送接收、串口关闭等核心流程&#xff0c;并给出拼包…

作者头像 李华
网站建设 2026/10/15 15:30:19

OpenCV 5 vs OpenCV 4:一次讲清所有差异

1.引言 OpenCV 5 不是“4.x 加功能”&#xff0c;而是把二十多年积累的技术债一次性清算&#xff0c;并顺手把 DNN 推理引擎推倒重写——前者决定你要不要改代码&#xff0c;后者决定你要不要升版本。 先看时间线&#xff0c;把版本关系理清楚&#xff1a; 2.总览对比图 …

作者头像 李华