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

数据结构 2.1 单链表

1.单链表
线性表:1.有限的序列 2.序列中的每一个元素都有唯一的前驱和后继,除了开头和结尾的两个节点。

顺序表:分配一块连续的内存去存放这些元素,eg、数组

链表:内存是不连续的,元素会各自被分配一块内存,内存和内存之间用指针进行相连。

顺序表和链表的区别是内存的连续与否

 data域 | next指针域 ——> data域 | next指针域 ——> data域 | next指针域 ——> NULL

单链表的操作:
1.增加 :1>头插法 2>尾插法
1>插入——> data域 | next指针域 ——> data域 | next指针域 ——> data域 | next指针域 ——> NULL
2>data域 | next指针域 ——> data域 | next指针域 ——> data域 | next指针域 ——> 插入——>NULL
2.删除:用前一个节点的指针直接指向对应节点的后一个节点的前驱,只操作一个指针。
为了使操作方便,在操作中添加一个头节点。头节点并不实际存储,只保存链表中的元素个数。
代码实现:

定义一个链表(结构体):

typedef struct Node {//定义一个结构体链表int data;//data域struct Node* next;//next指针
}Node;

初始化一个链表:

Node* initList() {//初始化一个链表Node* list = (Node*)malloc(sizeof(Node));//给新节点开辟空间list->data = 0;//data域list->next = NULL;//next指针return list;
}

头插法:

void headInsert(Node* list,int data){//头插法 list是头节点 data域Node* node = (Node*)malloc(sizeof(Node));//开辟空间,定义一个新节点node->data = data;//新节点的data域node->next = list->next;//新节点的next指针等于原先链表的头指针的nextlist->next = node;//原先头节点next指向新插入的头节点list->data++;//代表当前链表之中插入元素
}

尾插法:

void tailInsert(Node* list, int data){//尾插法Node* head = list;//头指针为定义的list头节点Node* node = (Node*)malloc(sizeof(Node));//定义新节点,开辟空间node->data = data;//新节点的data域等于原先链表头节点的data域 node->next = NULL;//尾插的新节点next为空list = list->next;//原先头节点往后延续while (list->next) {//判断是否到了最后list = list->next;}list->next = node;//先将头节点指针指向最后 头节点的下一个等于新插入的node节点head->data++;
}

删除:

void Delete(Node* list, int data){//删除Node* head = list;Node* pre = list;Node* current = list->next;list = list->next;while (current)//循环遍历到最后{if (current->data == data)//判断与删除元素是否相等{pre->next = current->next;free(current);//删除结点break;//找到则跳出循环}pre = current;//向下遍历current = current->next;}list->data--;
}

遍历操作:

void printList(Node* list) {//遍历操作list = list->next;//向后遍历while (list)//判空循环{printf("%d ", list->data);list = list->next;}printf("\n");
}

main函数:

int main()
{Node* list = initList();headInsert(list, 1);headInsert(list, 2);headInsert(list, 3);headInsert(list, 4);headInsert(list, 5);tailInsert(list, 6);tailInsert(list, 7);tailInsert(list, 8);tailInsert(list, 9);tailInsert(list, 10);printList(list);Delete(list, 5);printList(list);Delete(list, 10);printList(list);Delete(list, 6);printList(list);return 0;
}

整体函数:

typedef struct Node {//定义一个结构体int data;struct Node* next;
}Node;Node* initList() {//初始化一个链表Node* list = (Node*)malloc(sizeof(Node));list->data = 0;list->next = NULL;return list;
}void headInsert(Node* list,int data){//头插法Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->data++;//代表当前链表之中插入元素
}void tailInsert(Node* list, int data){//尾插法Node* head = list;Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;list = list->next;while (list->next) {list = list->next;}list->next = node;head->data++;
}void Delete(Node* list, int data){//删除Node* head = list;Node* pre = list;Node* current = list->next;list = list->next;while (current){if (current->data == data){pre->next = current->next;free(current);break;}pre = current;current = current->next;}list->data--;
}void printList(Node* list) {//遍历操作list = list->next;while (list){printf("%d ", list->data);list = list->next;}printf("\n");
}int main()
{Node* list = initList();headInsert(list, 1);headInsert(list, 2);headInsert(list, 3);headInsert(list, 4);headInsert(list, 5);tailInsert(list, 6);tailInsert(list, 7);tailInsert(list, 8);tailInsert(list, 9);tailInsert(list, 10);printList(list);Delete(list, 5);printList(list);Delete(list, 10);printList(list);Delete(list, 6);printList(list);return 0;
}

运行结果:

http://www.lryc.cn/news/184305.html

相关文章:

  • [Machine Learning]pytorch手搓一个神经网络模型
  • KdMapper扩展实现之Dell(pcdsrvc_x64.pkms)
  • python和go相互调用的两种方法
  • c# 分部视图笔记
  • Vue3最佳实践 第七章 TypeScript 中
  • (三)行为模式:8、状态模式(State Pattern)(C++示例)
  • nginx的配置文件概述及简单demo(二)
  • Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建
  • flex 布局:元素/文字靠右
  • java基础-第1章-走进java世界
  • jvm 堆内存 栈内存 大小设置
  • 免杀对抗-反沙盒+反调试
  • QTimer类的使用方法
  • (三)行为模式:9、空对象模式(Null Object Pattern)(C++示例)
  • Django实战项目-学习任务系统-用户登录
  • 【动手学深度学习-Pytorch版】Transformer代码总结
  • 做外贸独立站选Shopify还是WordPress?
  • echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里
  • jmeter分布式压测
  • consulmanage部署
  • 大数据软件项目的验收流程
  • 《第一行代码Andorid》阅读笔记-第一章
  • Educational Codeforces Round 146 (Rated for Div. 2)(VP)
  • 9.30国庆
  • java基础-第4章-面向对象(二)
  • flex加 grid 布局笔记
  • 最高评级!华为云CodeArts Board获信通院软件研发效能度量平台先进级认证
  • 图像上传功能实现
  • 03_Node.js模块化开发
  • Nginx支持SNI证书,已经ssl_server_name的使用