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

2024.7.19 作业

1.链表的排序

int list_sort(NodePtr L)
{if(NULL==L || L->len<=1){printf("排序失败");return -1;}int len=L->len+1;NodePtr p;int i,j;for( i=1;i<len;i++){for( j=0,p=L;j<len-i;j++,p=p->next){if( p->data > p->next->data ){datatype t=p->data;p->data=p->next->data;p->next->data=t;}}}printf("排序成功\n");return 0;
}

2.链表的反转(递归实现)

// 递归反转链表  
NodePtr list_fz(NodePtr L) 
{  // 基础情况:空链表或只有一个节点  if (L == NULL || L->next == NULL) {  return L;  }  NodePtr new_L = list_fz(L->next);  L->next->next = L;  L->next = NULL;return new_L; 
}

3.链表去重


// 去重函数
int list_dr(NodePtr L) 
{NodePtr current = L;NodePtr prev = NULL;while (current != NULL) {NodePtr runner = L;prev = NULL;int flag = 0;// 查找当前节点的重复项while (runner != current) {if (runner->data == current->data) {flag = 1;break;}prev = runner;runner = runner->next;}if (flag) {// 如果是重复节点,删除当前节点NodePtr temp = current;if (prev != NULL) {prev->next = current->next;} else {L = current->next; // 更新头节点}current = current->next;free(temp);} 	else 	{current = current->next;}}
}

linklist.h

#ifndef LINKLIST_H#define LINKLIST_H
#include <myhead.h>typedef int datatype;typedef struct Node
{union{int len;datatype data;};struct Node *next;
}Node,*NodePtr;//创建链表
NodePtr list_create();//申请节点封装数据函数
NodePtr apply_node(datatype e);//链表判空
int list_empty(NodePtr L);//头插
int list_insert_head(NodePtr L,datatype e);//链表遍历函数
int list_show(NodePtr L);//通过位置查找节点
NodePtr list_search_pos(NodePtr L,int pos);//任意位置插入
int list_insert_pos(NodePtr L,int pos,datatype e);//链表头删
int list_delete_head(NodePtr L);//任意位置删除
int list_delete_pos(NodePtr L,int pos);//通过值查找返回位置
int list_search_value(NodePtr L,datatype e);//链表按位置进行修改
int list_update_pos(NodePtr L,int pos,datatype e);//链表按值进行修改
int list_update_value(NodePtr L,datatype old_e,datatype new_e);//将链表进行翻转
void list_reverse(NodePtr L);//释放链表
void list_destroy(NodePtr L);//链表排序
int list_sort(NodePtr L);// 去重函数
int list_dr(NodePtr head);// 递归反转链表 
NodePtr list_fz(NodePtr L);#endif

linklist.c

#include "linklist.h"NodePtr list_create()
{NodePtr L=(NodePtr)malloc(sizeof(Node));if(NULL==L){printf("创建失败\n");return NULL;}L->len=0;L->next=NULL;printf("链表创建成功\n");return L;
}//申请节点封装数据函数
NodePtr apply_node(datatype e)
{NodePtr p=(NodePtr)malloc(sizeof(Node));if(NULL==p){printf("申请失败\n");return NULL;}p->data = e;p->next = NULL;return p;
}//链表判空
int list_empty(NodePtr L)
{return L->next ==NULL;
}//头插
int list_insert_head(NodePtr L,datatype e)
{if(NULL==L){printf("链表不合法\n");return -1;}NodePtr p = apply_node(e);if(NULL==p){return -1;}p->next=L->next;L->next=p;L->len++;printf("头插成功\n");return 0;}//链表遍历函数
int list_show(NodePtr L)
{if(NULL==L || list_empty(L)){printf("遍历失败\n");return -1;}	NodePtr q = L->next;while(q!=NULL){printf("%d\t",q->data);q=q->next;}putchar(10);
}//通过位置查找节点
NodePtr list_search_pos(NodePtr L,int pos)
{if(NULL==L || list_empty(L) || pos<0 || pos>L->len){printf("查找失败\n");return NULL;}NodePtr q= L;for(int i=0;i<pos;i++){q=q->next;}return q;
}//任意位置插入
int list_insert_pos(NodePtr L,int pos,datatype e)
{if(NULL==L || pos<=0 ||pos>L->len+1){printf("插入失败\n");return -1;}NodePtr p = apply_node(e);if(NULL==p){return -1;}NodePtr q =list_search_pos(L,pos-1);p->next=q->next;q->next=p;L->len++;printf("插入成功\n");return 0;
}//链表头删
int list_delete_head(NodePtr L)
{if(NULL==L || list_empty(L)){printf("删除失败\n");return -1;}NodePtr p=L->next;L->next=p->next;free(p);p=NULL;L->len--;printf("头删成功\n");return 0;
}//任意位置删除
int list_delete_pos(NodePtr L,int pos)
{if(NULL==L || list_empty(L) || pos<1 || pos>L->len){printf("删除失败\n");return -1;}NodePtr q=list_search_pos(L,pos-1);NodePtr p=q->next;q->next =p->next;free(p);p=NULL;L->len--;printf("删除成功\n");return 0;
}//通过值查找返回位置
int list_search_value(NodePtr L,datatype e)
{if(NULL==L || list_empty(L)){printf("查找失败\n");return -1;}NodePtr q=L->next;for(int index=1;index<=L->len;index++){if(q->data==e){return index;}q=q->next;}printf("没找到\n");return -1;
}//链表按位置进行修改
int list_update_pos(NodePtr L,int pos,datatype e)
{if(NULL==L || list_empty(L) || pos<1 || pos>L->len ){printf("修改失败\n");return -1;}list_search_pos(L,pos)->data = e;printf("修改成功\n");return 0;
}//链表按值进行修改
int list_update_value(NodePtr L,datatype old_e,datatype new_e)
{if(NULL==L || list_empty(L)){printf("修改失败\n");return -1;}int res = list_search_value(L,old_e);if(res == -1){printf("没有要修改的值\n");return -1;}list_update_pos(L,res,new_e);printf("修改成功\n");return 0;}//将链表进行翻转
void list_reverse(NodePtr L)
{if(NULL==L || L->len<=1){printf("翻转失败\n");return;}NodePtr H = L->next;L->next = NULL;NodePtr p = NULL;while(H!=NULL){p=H;H=H->next;p->next =L->next;L->next =p;}printf("翻转成功\n");return;
}//释放链表
void list_destroy(NodePtr L)
{//判断逻辑if(NULL == L){return;}//将所有结点进行释放while(!list_empty(L)){//头删list_delete_head(L);}//释放头结点free(L);L = NULL;printf("释放成功\n");
}//链表排序
int list_sort(NodePtr L)
{if(NULL==L || L->len<=1){printf("排序失败");return -1;}int len=L->len+1;NodePtr p;int i,j;for( i=1;i<len;i++){for( j=0,p=L;j<len-i;j++,p=p->next){if( p->data > p->next->data ){datatype t=p->data;p->data=p->next->data;p->next->data=t;}}}printf("排序成功\n");return 0;
}// 递归反转链表  
NodePtr list_fz(NodePtr L) 
{  // 基础情况:空链表或只有一个节点  if (L == NULL || L->next == NULL) {  return L;  }  NodePtr new_L = list_fz(L->next);  L->next->next = L;  L->next = NULL;return new_L; 
} // 去重函数
int list_dr(NodePtr L) 
{NodePtr current = L;NodePtr prev = NULL;while (current != NULL) {NodePtr runner = L;prev = NULL;int flag = 0;// 查找当前节点的重复项while (runner != current) {if (runner->data == current->data) {flag = 1;break;}prev = runner;runner = runner->next;}if (flag) {// 如果是重复节点,删除当前节点NodePtr temp = current;if (prev != NULL) {prev->next = current->next;} else {L = current->next; // 更新头节点}current = current->next;free(temp);} 	else 	{current = current->next;}}
}

main.c

#include"linklist.h"int main(int argc, const char *argv[])
{//调用函数创建一个链表NodePtr L = list_create();if(NULL == L){return -1;}//调用头插函数list_insert_head(L, 520);list_insert_head(L, 1314);list_insert_head(L, 666);list_insert_head(L, 999);//调用遍历函数list_show(L);//调用任意位置插入函数list_insert_pos(L, 1, 100);list_insert_pos(L, 3, 100);list_insert_pos(L, L->len+1, 100);list_show(L);printf("排序: ");list_sort(L);list_show(L);printf("去重:");list_dr(L);list_show(L);printf("反转:");L->next=list_fz(L->next);list_show(L);return 0;
}

思维导图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker 操作
  • PHP宠物店萌宠小程序系统源码
  • 【EI检索】第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)
  • 掌握构建艺术:在Gradle中配置自定义的源代码管理(SCM)
  • web前端 Vue 框架面试120题(四)
  • 我去,怎么http全变https了
  • 【SpringBoot】单元测试之测试Service方法
  • IDEA性能优化方法解决卡顿
  • 目标检测算法
  • java设计模式:03-04-装饰器模式
  • CH03_布局
  • python-快速上手爬虫
  • 项目收获总结--大数据量存储架构设计方案
  • Keil开发IDE
  • Qt中的高分辨率及缩放处理
  • ----------
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [数据结构]链表的实现在PHP中
  • CentOS 7 修改主机名
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux各目录及每个目录的详细介绍
  • Mysql优化
  • python_bomb----数据类型总结
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue.js框架原理浅析
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 大主子表关联的性能优化方法
  • 第2章 网络文档
  • 高性能JavaScript阅读简记(三)
  • 计算机在识别图像时“看到”了什么?
  • 力扣(LeetCode)21
  • 面试遇到的一些题
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深度学习中的信息论知识详解
  • 使用agvtool更改app version/build
  • 7行Python代码的人脸识别
  • 湖北分布式智能数据采集方法有哪些?
  • ​2020 年大前端技术趋势解读
  • ​补​充​经​纬​恒​润​一​面​
  • ​力扣解法汇总946-验证栈序列
  • ​人工智能书单(数学基础篇)
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ###C语言程序设计-----C语言学习(6)#
  • (+4)2.2UML建模图
  • (笔试题)合法字符串
  • (第一天)包装对象、作用域、创建对象
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (回溯) LeetCode 78. 子集
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)shell调试方法