目录

单链表介绍​

单链表基本操作及图解分析

1.创建一个新结点

2.头插法向单链表中插入结点​

3. 尾插法向单链表中插入结点​

4.头删法删除单链表结点​

5.尾删法删除单链表结点​

6.返回单链表长度​

7.删除单链表任意一个结点​

8.查找某结点​

9.在某结点前插入新结点​

总结​:


单链表介绍

单链表结点:数据域+指针域(指向下一个结点)

结点的表示方式:

typedef struct LNode
{ElemType data;struct LNode *next;
}LNode;

单链表头指针:恒指向线性表中的第一个结点,没有结点指向NULL

线性表链式的存储特点:是一组任意的存储单元存储线性表的数据元素(物理地址可连续可不连续)。

线性表链式的逻辑特点:数据元素之间的关系是由头指针和结点中的指针指示的。

总结:

单链表能通过头指针找到第一个结点,第一个结点又能通过其指针域找到下一个结点,依次类推,只要有头指针指向单链表,那么该单链表中的元素就能被找到。

单链表基本操作及图解分析

1.创建一个新结点

LNode * NewNode(EleType data)
{LNode* newNode = (LNode*)malloc(sizeof(LNode));//创建新结点//初始化结点newNode->data = data;newNode->next = NULL;return newNode;//返回新结点指针
}

2.头插法向单链表中插入结点

当链表为空时:

当链表不为空时

void LinkListPushFront(LinkList** pphead, EleType data)
{LNode* newNode = NewNode(data);if (*pphead == NULL)//如果链表为空,将头指针指向新结点{*pphead = newNode;}else {newNode->next = *pphead;//新结点的指针域指向头结点*pphead = newNode;//头指针指向新结点}
}

3. 尾插法向单链表中插入结点

当链表为空时:

当链表不为空时

void LinkListPushBack(LinkList** pphead, EleType data)
{LinkList* tail = *pphead;LNode* newNode = NewNode(data);if (*pphead == NULL)//链表为空,直接将头指针指向该节点{*pphead = newNode;return;}else{ while (tail->next != NULL)//找到最后一个节点{tail = tail->next;}}tail->next = newNode;//将最后一个节点和新节点连接
}

4.头删法删除单链表结点

当链表为空时,不删除。

当链表中有多个元素时:

void LinkListPopFront(LinkList **pphead)
{if (NULL == *pphead)//检查链表是否为空链表{perror("NULL\n");return;}else{LinkList *temp = *pphead;*pphead = (*pphead)->next;//头指针指向第二个结点free(temp);//释放第一个结点空间}}

5.尾删法删除单链表结点

当链表为空时,不删除。

当链表中只有一个元素时,释放该结点,头指针指向空。

当链表中有多个结点时:

void LinkListPopBack(LinkList **pphead)
{if (NULL == *pphead)//空{perror("链表为空\n");return;}else if ((*pphead)->next == NULL)//一个节点,直接删除{free(*pphead);*pphead =NULL;}else{LinkList *tail = *pphead;LinkList *pre = NULL;//保存倒数第二个结点的地址while (tail->next !=NULL)//寻找尾结点{pre = tail;tail = tail->next;}free(tail);//释放删除的结点pre->next = NULL;}
}

6.返回单链表长度

时间复杂度:O(n)

int SizeLinkList(LinkList* pphead)
{int count = 0;//计数器if (pphead == NULL){return 0;}else{while (pphead != NULL){count++;pphead = pphead->next;}return count;}
}

7.删除单链表任意一个结点

时间复杂度:O(n)

删除第一个位置为头删

int DeletElem(LinkList** pphead, int pos)
{if (*pphead == NULL){return 0;}else if (pos == 1){LinkListPopFront(pphead);return 1;}else{if (pos > SizeLinkList(*pphead))//判断删除的位置是否大于链表长度{return 0;}LinkList* tail = *pphead;//遍历链表节点 LinkList* pre = NULL;//删除结点的前驱结点while (tail->next != NULL && pos>1){pre = tail;tail = tail->next;pos--;}pre->next=tail->next;//将前驱结点和tail->next连接free(tail);return 1;}
}

8.查找某结点

时间复杂度:O(n)

LNode* FindElem(LinkList* pphead, EleType data)
{if (pphead == NULL){ return NULL;}else{while (pphead != NULL){if(pphead->data == data){return pphead;}pphead = pphead->next;}return NULL;}

9.在某结点前插入新结点

时间复杂度:O(n)

void LinkListInsert(LinkList** head, LNode* pos, EleType data)
{if (pos == *head){//头插LinkListPushFront(head,data);}else if (pos == NULL){return;}else {LNode* newNode = NewNode(data);LNode* tail = *head;while (tail->next != pos )//查找待插入结点的前一个结点{tail = tail->next;}tail->next = newNode;newNode->next = pos;}
}

总结

单向链表的优点:在插入和删除操作时,只需要修改被删节点上一节点的链接地址,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。

单向链表的缺点:

1、没有解决连续存储分配带来的表长难以确定的问题。

2、失去了顺序存储结构随机存取的特性。

最后祝大家:阖家欢乐,学有所成。

【数据结构-C】单链表基本操作及图解分析相关推荐

  1. 【数据结构】单链表基本操作(C++实现)

    代码主体使用结构体+类+模板进行实现. 1.LinkList.h //LinkList.h #pragma once #include<iostream> using namespace ...

  2. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  3. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  4. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  5. 数据结构:单链表中在P结点前插入S结点

    标题:数据结构:单链表中在P结点前插入S结点 在数据结构的习题中偶然看到了一个题目 已知在单链表中P不是首元结点也不是尾元结点,在P结点前插入S结点 #include<stdio.h> # ...

  6. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

  7. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

  8. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  9. 基本的数据结构:单链表(Singly Linked List)

    一.基本的数据结构:单链表(Singly Linked List) 什么是单链表? 下面是百度百科给出的官方解释: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表 ...

最新文章

  1. 神经网络之 CNN 与 RNN 的关系
  2. Android SingleTask启动模式与Home键的问题
  3. AspectJ 中的pointcut 语法
  4. docker --- mysql的部署
  5. python如何引用txt_如何使用pip requirements.txt文件安装python模块附加组件
  6. 漫画:如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460的延迟?
  7. 02函数极限存在条件
  8. jvm垃圾回收机制_详解JVM内存管理与垃圾回收机制1 - 内存管理
  9. gatewayworker配置php,tp5整合GatewayWorker
  10. c#和python_C#学习笔记(与Java、C、C++和Python对比)
  11. java怎么连接activemq集群_ActiveMQ之集群(主从)搭建-yellowcong
  12. Python获取金山词霸每日一句
  13. Postgresql 地理位置操作
  14. 计算机管理可以全自动,这款全自动化的小工具,可以让你在父母面前光明正大得玩电脑啦...
  15. WebSphere/WebLogic缓存清理
  16. 蓝瘦香菇!美国帅小伙作死尝试无人机剪头发
  17. 三行代码可视化神经网络特征图
  18. 抖音不搞「盲目」社交
  19. 【uni-app】微信开发者工具注意点(微信小程序)
  20. 《博客服务自律公约》现征求意见了!

热门文章

  1. IE 11 请求语言zh-Hans-CN所引发的问题及解决方案
  2. 希望计算机专业同学都知道这些宝藏老师
  3. Android汽车服务篇(五) CarDrivingStateService
  4. python 读取文本及 read()、readline() 和 readlines()区别
  5. php 数组保存到文件的方法 (数组转为字符串)
  6. 搭建基于 nodejs 的 MQTT 服务器
  7. 纯电动汽车结构分类和整体认识
  8. 河南省的地市编码json
  9. Java集合学习十三 SortedMap
  10. 怎么解决WiFi共享精灵中的错误代码:8000ffff