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

线性表-单链表-C语言实现

线性表-单链表

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 2024.8.11/*1. 单链表的定义LinkList 表示 LNode* 类型的指针
*/
typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;/* 2. 带头节点的单链表的初始化*L 指向节点的指针 初始化的时候,必须传入 指向 头节点指针的指针 	*/bool InitList(LinkList *L){*L = (LNode*)malloc(sizeof(LNode));// 检查内存分配是否成功if(*L == NULL) return false;(*L)->next = NULL;return true; 
}/*3. 求表长 
*/int Length(LinkList L){int len = 0;// p指向第一个节点 LinkList p = L->next;while(p!=NULL){len++;p = p->next;}return len;
}/*4. 按序号查找节点查找第i个节点,返回该节点的指针;如果i大于单链表的长度,返回 NULL 
*/LinkList GetElem(LinkList L,int i){// 让 p 指向头节点 LinkList p = L;while(i>0){if(p==NULL){return p;}p=p->next;i--;}return p;
}/*5. 按值查找表节点找到值相同的节点,返回该节点的指针;没有找到,返回NULL 
*/LinkList LocateElem(LinkList L,int e){LinkList p = L->next;while(p!=NULL){if(p->data == e){return p;}p = p->next;}return p;
}/*6. 插入节点在 第 i 个位置插入新节点插入成功返回 true, 插入位置i不合法(大于链表长度+1),返回false 
*/
bool ListInsert(LinkList L,int i,int data){if(i <= 0) return false;int j = 0;LinkList p = L;while(j<i-1){if(p==NULL) return false; // i > (len+1)p = p->next;j++;}LinkList s = (LinkList)malloc(sizeof(LNode));if (s == NULL) return false; // 检查内存分配是否成功s->data = data;s->next = p->next;p->next = s;return true;
}/*7. 删除第i个节点,将第i个节点的值赋给 e指向的地址处 删除成功返回 true, 删除失败返回 false 
*/bool ListDelete(LinkList L,int i,int *e){if(i <= 0) return false;LinkList p = L; // p 指向头节点 int j = 0; while(j < i-1){if(p == NULL) return false;p = p->next;j++;}if(p->next == NULL) return false; // i 超过长度LinkList s = p->next; // s指向要删除的节点 *e = p->next->data;p->next = s->next;free(s); return true;
}/*8.头插法建立新链表将 输入的值插入到链表的表头,输入 9999 表示结束 
*/LinkList List_HeadInsert(LinkList L){int x;LinkList s; // s 指向待插入的新节点 scanf("%d",&x);while(x!=9999){s = (LinkList) malloc(sizeof(LNode));if(s==NULL) break;s->data = x;s->next = L->next;L->next = s;scanf("%d",&x);}return L;
}/*9. 尾插法建立单链表 L 是一个只带头节点的空链表 
*/
LinkList List_TailInsert(LinkList L){int x;LinkList t = L; // 尾节点 LinkList s; // 待插入的节点scanf("%d",&x);while(x!=9999){s = (LinkList) malloc(sizeof(LNode));if(s==NULL) break;s->data = x;t->next = s;t = s;scanf("%d",&x);} t->next = NULL;return L;
}// 打印链表 
void printList(LinkList L){LinkList p = L->next;while(p!=NULL){printf("%d ",p->data);p = p->next;}printf("\n");
}int main(){// LinkList 指向 LNode 的指针LinkList list;if(InitList(&list)){printf("链表初始化成功\n"); }ListInsert(list,1,1); ListInsert(list,2,2);ListInsert(list,3,3);ListInsert(list,4,4);ListInsert(list,5,5);ListInsert(list,5,-1);if(ListInsert(list,10,5)){printf("插入成功\n"); }else{printf("插入失败\n"); }printList(list);int deleteData;if(ListDelete(list,2, &deleteData)){printf("删除第 2 个节点成功,第2个节点的值 %d \n",deleteData);}else{printf("删除失败\n");}printList(list);int len = Length(list);printf("链表长度 %d \n",len);int n2 = 1;LinkList node2 =LocateElem(list,n2);if(node2 == NULL){printf("链表不存在值为%d的节点 \n",n2);}else {printf("链表存在值为%d的节点,节点数据域:%d \n",n2,node2->data);}int n1 = 1;LinkList node1 = GetElem(list,n1);if(node1 == NULL){printf("链表第 %d 个节点不存在 \n",n1);}else {printf("链表第个 %d 节点数值 %d \n",n1,node1->data); }// 头插 LinkList list2;if(InitList(&list2)){printf("链表初始化成功\n"); }List_HeadInsert(list2);printList(list2);// 尾插LinkList list3;if(InitList(&list3)){printf("链表初始化成功\n"); }List_TailInsert(list3); printList(list3);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ESP01开发实例】- ISD1820录音控制
  • JDK17下载安装卸载
  • gdb调试core dump快速入门
  • 异或高斯消元模板(板子整理)
  • 【Leetcode 242 】有效的字母异位词——这也太简单了吧
  • .gitignore不生效的解决方案
  • resource not found with Azure OpenAI service
  • day16-测试自动化之selenium的PO模式
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • 八、MyBatis
  • 《网络编程实战系列》(17)网络桥接模式
  • 【设计模式】一文读懂策略模式
  • 【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点
  • zip压缩包的格式不标准导致C++开源unzip.cpp解压失败问题的排查
  • loginApi
  • 【Amaple教程】5. 插件
  • interface和setter,getter
  • JavaScript 奇技淫巧
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • k8s 面向应用开发者的基础命令
  • Laravel 实践之路: 数据库迁移与数据填充
  • Markdown 语法简单说明
  • Node + FFmpeg 实现Canvas动画导出视频
  • orm2 中文文档 3.1 模型属性
  • React的组件模式
  • 高性能JavaScript阅读简记(三)
  • 后端_ThinkPHP5
  • 京东美团研发面经
  • 数据可视化之 Sankey 桑基图的实现
  • 思否第一天
  • 算法-插入排序
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我建了一个叫Hello World的项目
  • 移动端唤起键盘时取消position:fixed定位
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #java学习笔记(面向对象)----(未完结)
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)模仿学习-完成后台管理页面查询
  • (转)程序员疫苗:代码注入
  • *** 2003
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • ./configure,make,make install的作用
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 的程序集加载上下文
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NetCore发布到IIS