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

链表-线性表的链式表示

链表-线性表的链式表示

L
xxx / 0x9d15e0
data1 / 0x9d17a0
data2 / 0x9d1660
data3 / NULL

头插法

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;
typedef struct LNode {// 存储数据ElemType data;// 后继节点地址LNode *next;
} LNode, *LinkList;/** 头插法创建链表*/
void list_head_insert(LinkList &L) {// 创建头节点// L指向头节点L = (LinkList) malloc(sizeof(LNode));L->next = NULL;// 创建新节点指针LinkList new_node;ElemType data;// 读取数据scanf("%d", &data);while (999 != data) {// 创建新节点// 指针指向新节点new_node = (LinkList) malloc(sizeof(LNode));// 存入数据值new_node->data = data;// 新节点的next指向链表的第一个元素(不包含头节点)new_node->next = L->next;// 新节点作为第一个节点L->next = new_node;// 再次读取数据scanf("%d", &data);}
}/** 打印链表*/
void print_list(LinkList L) {// L指向第一个节点L = L->next;while (NULL != L) {printf("%3d", L->data);// 指向下一个节点L = L->next;}
}int main() {// 一、创建链表头指针LinkList L;// 二、头插法创建链表list_head_insert(L);// 三、打印链表print_list(L);return 0;
}

尾插法

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;typedef struct LNode {// 存储数据ElemType data;// 后继节点地址LNode *next;
} LNode, *LinkList;/** 尾插法创建链表*/
void list_tail_insert(LinkList &L) {// 创建头节点// L指向头节点L = (LinkList) malloc(sizeof(LNode));L->next = NULL;// 创建新节点指针变量s 尾节点指针变量rLinkList new_node, r;r = L;ElemType data;scanf("%d", &data);while (999 != data) {// 创建新节点new_node = (LinkList) malloc(sizeof(LNode));// 存入数据值new_node->data = data;// 尾节点的next指向新节点r->next = new_node;// 新节点变成尾节点r = new_node;// 输入数据scanf("%d", &data);}// 尾节点的next指向NULLr->next = NULL;
}/** 打印链表*/
void print_list(LinkList L) {// L指向第一个节点L = L->next;while (NULL != L) {printf("%3d", L->data);// 指向下一个节点L = L->next;}printf("\n");
}/** 通过位置查找元素*/
LinkList search_elem_by_location(LinkList L, int pos) {// 判断位置是否合法if (0 > pos) {return NULL;}int i = 0;while (L && i < pos) {L = L->next;i++;}return L;
}/** 通过值查找元素*/
LinkList search_elem_by_value(LinkList L, ElemType data) {while (L) {if (data == L->data) {return L;}// 未匹配时 L指向下一个节点L = L->next;}return L;
}/** 链表插入元素* 此处不改变头指针L因此不需要写引用* @param*/
bool list_insert_elememt(LinkList L, int pos, ElemType data) {// 获取第pos-1个元素LinkList p = search_elem_by_location(L, pos - 1);// 判断位置是否合法if (NULL == p) {return false;}// 创建新节点LinkList q = (LinkList) malloc(sizeof(LNode));q->data = data;q->next = p->next;p->next = q;return true;
}/** 按位置删除元素* 此处不改变头指针L因此不需要写引用*/
bool list_delete(LinkList L, int pos) {// 查询第pos-1个位置LinkList p = search_elem_by_location(L, pos - 1);if (NULL == p) {return false;}// 被删除的元素LinkList q;q = p->next;// 如果要删除的位置 超过了链表长度if (NULL == q) {return false;}// 断链p->next = q ->next;// 释放节点空间free(q);return true;
}int main() {// 一、创建链表头指针LinkList L;// 二、尾插法创建链表list_tail_insert(L);// 三、打印链表print_list(L);// 四、查询操作LinkList search_elem = search_elem_by_location(L, 2);// 按位置查找元素if (search_elem) {printf("search elem by location success\n");printf("element data = %d\n", search_elem->data);} else {printf("search elem by location faild\n");}// 按值查询元素search_elem = search_elem_by_value(L, 99);if (search_elem) {printf("search elem by value success\n");printf("element data = %d\n", search_elem->data);} else {printf("search elem by value faild\n");}// 五、插入操作// 新节点插入在第i个位置bool ret = list_insert_elememt(L, 2, 19);if (ret) {printf("insert success\n");} else {printf("insert fail\n");}print_list(L);// 六、删除操作ret = list_delete(L, 9);if (ret) {printf("delete success\n");} else {printf("delete failed\n");}print_list(L);return 0;
}
http://www.lryc.cn/news/353907.html

相关文章:

  • GNU/Linux - 时区设置
  • 红队攻防渗透技术实战流程:云安全之云原生安全:内核漏洞和版本漏洞
  • spring状态机实战
  • Ubuntu系统上安装NVIDIA驱动【笔记】
  • 生成式AI导论2024-李宏毅
  • 跨平台之用VisualStudio开发APK嵌入OpenCV(三)
  • 渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP
  • vue.js对接海康威视摄像头web开发包
  • Selenium中使用的三种等待
  • 推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)
  • LLaMA-Factory 微调训练
  • 阿里云ECS服务器怎么设置时区
  • 【698协议】帧校验算法
  • FileZilla“服务器发回了不可路由的地址,使用服务器地址代替
  • 【路径规划】基于遗传算法GA实现最短距离 多起点多终点多旅行商问题求解附Matlab代码
  • 计算机毕业设计 | springboot+vue房屋租赁管理系统(附源码)
  • 重大活动网络安全保障建设及运营指南
  • 基于信号分解方法的机械故障诊断方法存在的问题
  • faster_whisper语音识别
  • Java锁的策略
  • 521源码-免费代码基础学习-PHP如何运用变量教程
  • 单选或者多选的知识问题调研系统,怎么使用Neo4j的图数据库来实现
  • 【微机原理及接口技术】可编程并行接口芯片8255A
  • 第3天 Web源码拓展_小迪网络安全笔记
  • 基于物联网技术的智能家居实训教学解决方案
  • K-近邻算法(KNN)基础详解
  • spring aop 内部引用失效分析
  • IEDA常用快捷键(后续更新ing)
  • Day03—flask与react实现交互(解决跨域问题)
  • JavaScript中的闭包