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

链表的常见操作

链表

文章目录

  • 链表
    • 创建链表
        • 单链表
          • 实现
          • 错例
      • 循环链表
        • 单独创建
        • 逐节点创建
        • 约瑟夫环问题
    • 删除节点
      • 实现方式一:
      • 实现方式二:
      • 删除节点并建立新链表
    • 逆置链表
      • 实现:
    • 链表排序

struct List
{int data;struct List* next;
}

创建链表

单链表
实现
struct List* listCreate()
{int data;struct List* head = NULL;struct List* pre = NULL;struct List* current = NULL;while(scanf("%d",&data) && data != -1){current = (struct List*)malloc(sizeof(struct List));if(head == NULL)head = current;elsepre->next = current;current->next = NULL;current->data = data;pre = current;}return head;
}
错例
struct List* listCreate()
{int data;;struct List* current = NULL;struct List* head = current;while (scanf("%d", &data) && data != -1){current = (struct List*)malloc(sizeof(struct List));if (head == NULL)head = current;current->data = data;current = current->next;}return head;
}

在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

循环链表

单独创建
struct List* circle_listCreate()
{int data;struct List* head = NULL;struct List* pre = NULL;struct List* current = NULL;while(scanf("%d",&data) && data != -1){current = (struct List*)malloc(sizeof(struct List));if(head == NULL)head = current;elsepre->next = current;current->next = head;current->data = data;pre = current;}return head;
}
逐节点创建
void Append(struct List** L,int data)
{struct List* head = *L;struct List* newNode = NULL;if((*L) == NULL){(*L) = (struct List*)malloc(sizeof(struct List));(*L)->data = data;head = (*L);(*L)->next = head;}else{while ((*L)->next != head){(*L) = (*L)->next;}newNode = (struct List*)malloc(sizeof(struct List));newNode->data = data;(*L)->next = newNode;newNode->next = head;*L = head;}
}
约瑟夫环问题
void Append(struct List** L,int data)
{struct List* head = *L;struct List* newNode = NULL;if((*L) == NULL){(*L) = (struct List*)malloc(sizeof(struct List));(*L)->data = data;head = (*L);(*L)->next = head;}else{while ((*L)->next != head){(*L) = (*L)->next;}newNode = (struct List*)malloc(sizeof(struct List));newNode->data = data;(*L)->next = newNode;newNode->next = head;*L = head;}
}
void Display(struct List* L,int num)
{struct List* head = L;struct List* pre = NULL;struct List* kill = NULL;int nodeNum = 0;while (L->next != head){nodeNum++;L = L->next;}pre = L;L = L->next;nodeNum++;while (nodeNUm){if (nodeNum == 1){printf("%d",L->data);free(L);return;}for (int i=1; i < m; i++){pre = L;L = L->next;}printf("%d ", L->data);kill = L;L = L->next;free(kill);nodeNum--;}
}

删除节点

实现方式一:

struct list* listDelete(struct list* L,int data)
{struct list* pre = L;struct list* head = L;struct list* kill;while(head != NULL && head->data == m){kill = head;head = head->next;free(kill);}if(head == NULL)return head;pre = head;kill = head->next;while(kill!=NULL){if(kill->data == m){pre->next = kill->next;free(kill);kill = pre->next;}else{pre = kill;kill = kill->next;}}return head;
}

实现方式二:

struct list* listDelete(struct list** L,int data)
{struct list* head = (*L), * pre = (*L);struct list* newL = *L;struct list* kill = NULL;while (*L !- NULL){if((*L)->data == data){if((*L) == newL)newL == newL->next;elsepre->next = (*L)->next;kill = (*L);(*L) = (*L)->next;free(kill);}else{pre = (*L);(*L) = (*L)->next;}}*L = newL;return head;
}

删除节点并建立新链表

struct list* list_Delete_Create(struct list** L) //数据为奇数存为新链表
{struct list* newhead = NULL, * newcurrent = NULL, * newpre = NULL;struct list* newL = *L;struct list* kill = NULL;struct list* pre = *L;while (*L){if((*L)->data%2 == 1){newcurrent = (struct list*)malloc(sizeof(struct list));if(newhead == NULL)newhead = newcurrent;elsenewpre->next = newcurrent;newcurrent->data = (*L)->data;newcurrent->next = NULL;newpre = newcurrent;if((*L) == newL)newL = newL->next;elsepre-next = (*L)->next;kill = (*L);(*L)=(*L)->next;free(kill);}else{pre = (*L);(*L) = (*L)->next;}}*L = newL;return newhead;
}

逆置链表

实现:

struct list* reverse(struct list* L)
{struct list* newhead = NULL, * current;while (L != NULL){current = (struct list*)malloc(sizeof(struct list));current->data = L->data;L = L->next;current->next = newhead;newhead = current;}free(L);return newhead;
}

链表排序

相关文章:

  • 【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?
  • 如何使用阿里云CDN服务?
  • Pandas实战100例 | 案例 100: 将 DataFrame 保存为 CSV 文件
  • 以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?
  • mysql主从报错:Last_IO_Error: Error connecting to source解决方法
  • 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队
  • 限制API接口访问速率
  • 大语言模型系列-BERT
  • DNS - 全家桶(114 DNS、阿里DNS、百度DNS 、360 DNS、Google DNS)
  • 图像处理:孤立点的检测
  • rust获取本地ip地址的方法
  • 基于小波多普勒变换的回波信号检测matlab仿真
  • 技术进化与经济互动的深刻洞察——《技术的本质》读书笔记
  • 2000W双向逆变器介绍
  • 运动型蓝牙耳机推荐哪款?2024运动耳机排行榜最新
  • python3.6+scrapy+mysql 爬虫实战
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • HTTP中的ETag在移动客户端的应用
  • Java面向对象及其三大特征
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux CTF 逆向入门
  • miaov-React 最佳入门
  • Objective-C 中关联引用的概念
  • Sass 快速入门教程
  • Vue 重置组件到初始状态
  • 从PHP迁移至Golang - 基础篇
  • 多线程 start 和 run 方法到底有什么区别?
  • 聊一聊前端的监控
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 移动端高清、多屏适配方案
  • ​马来语翻译中文去哪比较好?
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #预处理和函数的对比以及条件编译
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)appium-desktop定位元素原理
  • (转)jdk与jre的区别
  • (转载)(官方)UE4--图像编程----着色器开发
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .bat批处理(六):替换字符串中匹配的子串
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core引入性能分析引导优化
  • .NET Core中Emit的使用
  • .NET Core中的去虚
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET简谈设计模式之(单件模式)
  • .Net语言中的StringBuilder:入门到精通
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [20171101]rman to destination.txt