文章目录

  • 前言
  • 一、单链表定义
  • 二、单链表的基本操作
    • 1.遍历操作
    • 2.链表长度
    • 3.链表查找
    • 4.链表插入
    • 5.头插入法(创建链表)
    • 6.尾插法(创建链表)
    • 7.删除结点
    • 8.链表释放
  • 三、循环链表
  • 四、双向链表
  • 总结

前言


提示:以下是本篇文章正文内容

一、单链表定义

当需要建立一个学生信息表,学生的人数无法确定而且人数经常变化,此时若用顺序表来实现将会很麻烦

单链表:线性表的链接存储结构, 用一组任意(不联系, 零散分布) 的存储单元存放线性表的元素.

存储特点:
1.逻辑次序和物理次序不一定相同

2.元素之间的逻辑关系用指针表示

如(a1, a2 ,a3, a4)存储在内存中

结点结构

单链表是由若干结点构成的, 结点包含数据域和指针域

data: 存储数据元素
next: 存储指向后继结点的地址

// 定义节点
typedef struct node
{int data;              //数据域struct node *next;     //指针域
}Node,*Link;               //定义别名 Node, Link

申请一个结点

p=(Link)malloc(sizeof(Node));


结点建立之后,
引用数据元素: (*p).data <==> p->data
引用指针元素: p->next

链表(a1, a2, a3, a4)

头指针:指向第一个结点的地址

尾标志:终端节点的指针域为空

首元结点:链表第一个数据结点

头节点: 在单链表的第一个元素结点之前附设一个类型相同的结点, 以便空表和非空表的处理统一

注:头节点的数据域一般为空, 指针域指向第一个节点

二、单链表的基本操作

1.遍历操作

接口操作: void displayNode(Link head);

void displayNode(Link head)
{Link p = head->next;          //p指向首元结点while(p != NULL){printf("%d\t",p->data);  //输出数据 p = p->next;             //移向下一个结点}
}

2.链表长度

操作接口:int length(Link head);

伪代码:
1.工作指针p初始化, 累加器count初始化

2.重复执行下述操作, 直到p为空;

  (1)工作指针p后移(2)count++

3.返回累加器count的值

int length(Link head)
{int count = 0;Link p = head->next;while(p != NULL){p = p->next;count++;}return count;
}

3.链表查找

操作接口:bool queryNode(Link head, int x);

思路: 依次遍历链表的数据域 与要查找的数据进行比较

bool queryNode(Link head, int x)
{Link p = head->next;while(p != NULL){if(p->data == x) //查找成功{printf("d",p->data);return true;}p = p->next;   //没有找到,移动结点}return false;     //查找失败返回false
}

4.链表插入

操作接口:bool insertNode(Link head, int index, int item);

思路:

插入到第i个结点, 先找到第i-1 个节点, 然后, 让插入结点的指针域指向i-1个结点的指向的指针域, 再修改第i-1结点的指针域, 使其指向插入结点. 注意, 修改指针指向的顺序不要颠倒, 不然会导致找不到第i个结点. 对于边界情况也同样适合.

伪代码
1.工作指针p初始化
2.查找第i-1个结点, 并使该指针p指向该结点
3.若查找不成功,则返回false
否则:

3.1生成一个元素值为x的新结点node
3.2将新结点插入到p所指向的结点
3.3返回true

bool  insertNode(Link head, int index, int item)
{int count=0;Link p = head;Link node;while(p != NULL && count < index-1)   //找到第index前一个结点{p = p->next;count++;}if(p == NULL){return false;                    //没有找到第i-1个结点}else{node = (Link)malloc(sizeof(Node));//申请一个结点node->data = item;                //结点的数据域node->next = p->next;             //修改指针指向关系p->next = node;return true;}
}

5.头插入法(创建链表)

操作接口:Link newList(const int a[],int n);
头插法:将待插入的结点插在头节点的后面,插入顺序最终相反

这与链表插入一样的, 若以数组传入参数, 则生成的链表的数据则与数组的数据刚好相反

template <class DataType>
Link newList(DataType a[],int n)
{int i=0;//创建头结点Link head = (Link)malloc(sizeof(Node));head->next = NULL;//创建后续结点for(i=0;i<n;i++){Link node = (Link)malloc(sizeof(Node));node->data = a[i];node->next = head->next;head->next = node;}return head;
}

6.尾插法(创建链表)

操作接口:Link new_List(const int a[],int n);
尾插法:将待插入结点插在终端结点的后面

Link new_List(const int a[],int n)
{int i=0;Link head = (Link)malloc(sizeof(Node));Link rear = (Link)malloc(sizeof(Node));head->next = NULL;rear = head;             //尾指针初始化for(i=0;i<n;i++){Link node = (Link)malloc(sizeof(Node));node->data = a[i];rear->next = node;rear = node;}rear->next = NULL;  //保证最后一个结点指针域为空return head;
}

7.删除结点

操作接口:bool deleteNode(Link head,DateType x);

思路:
引入两个指针p,q, p指向要删除的结点, q指向要删除结点的前一个结点

找到要删除的结点, 用free()函数释放该节点, 并修改删除结点两边指针关系情况,
要保证p,q指针一前一后: 在插在过程中, 若发现结点p指向的数据域不等于x, 则p,q指针同时向前移动即可

若在查找过程一直没有找到要删除的结点(链表遍历完毕),则退出循环,返回错误

bool deleteNode(Link head,DateType x)
{Link p,q;if(head==NULL || head->next==NULL)  //链表没有数据,返回错误{return false;}p=head->next;      //初始化p,q 并保证p,q 一前一后q=head;while(p!=NULL){if(p->data==x) //找到结点x ,删除并将两边结点链接起来{q->next=p->next;free(p);return true;}else           //没有找到,p,q依次往前移动{q=p;p=p->next;}}//若循环结束了,说明没有找到该结点return false;
}

8.链表释放

操作接口:void clearLink(Link head)
将单链表中所有结点存储空间释放, 要保证链表末处理的部分不断开

void clearLink(Link head)
{Link q;while(head->next!=NULL){q=head;head=head->next;free(q);}
}

三、循环链表

将单链表的首尾相接,将终端结点的指针域由空指针改为指向头节点,构成单循环链表,简称循环链表。

循环链表没有明显的尾端,如何避免死循环?

单链表---->循环链表

p != NULL----> p !=head
p->next != NULL----> p->next != head

四、双向链表

在单链表的每个结点中再设置一个指向其前驱节点的指针域

data: 数据域,存储数据元素
prior: 指针域,存储该结点的前驱结点地址
next:指针域,存储该结点的后继结点地址


总结

提示:这里对文章进行总结:

链表的基本操作(C/C++)相关推荐

  1. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

  2. 链表的基本操作 java_详细实现单链表的基本操作【Java版】

    节点类 static Node head=new Node(); static class Node{ int data; Node next; public Node() {//无参构造方法,默认d ...

  3. 链表c++语言 解析,C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数 ...

  4. 《剑指offer》第二章小结(1)——链表的基本操作

    <剑指offer>第二章小结(1)--链表的基本操作 面试题5是从尾到头打印链表,与此相关的链表的基本操作应该知道. 下面代码中列举了单链表的创建.遍历.插入和删除四种操作.参考网址: h ...

  5. 【BUCTOJ】链表的基本操作

    原始题目 题题目描述 链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表.它较顺序表而言在插入和删除时不必移动其后的元素.现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在 ...

  6. 链表的基本操作(C语言)详解(摘取自C语言学习网2.5)

    链表的基本操作(C语言)详解 #include <stdio.h> #include <stdlib.h>typedef struct Link{int elem;struct ...

  7. 单链表的基本操作-插入结点、删除结点、新建链表、查找结点位置

    ** C语言新手小白的学习笔记-------------目前持续更新中 ** 本人90后电气工程及其自动化大学生,大二开始接触C语言,写过前端,Python,但是都不精通,通过许多认识后明白了自身的许 ...

  8. 【C++】链表及基本操作

    链表及基本操作 定义 基本操作 1. 创建单链表 2. 插入节点 3. 删除节点 4. 反转链表 5. 倒数第K个节点 6. 是否有环 本文所述均为单向链表. ps:更多数据结构知识详见: 常见数组结 ...

  9. 入门:链表的基本操作

    入门:链表的基本操作 标签:C语言 链表 By 小威威 1.写这篇博文的原因 C语言有三大重要部分:流程控制.函数.指针. 对于指针,单单了解它的简单应用是不够的,最重要的还是学习链表.许多参考书对链 ...

  10. 【Java】链表的基本操作

    链表主要是为了弥补一些顺序表的缺点: 顺序表的插入删除操作时间复杂度为 O(N) 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗 增容一般都是成2倍增长,会浪费一定的空间 为了解决以上问题引 ...

最新文章

  1. 编程语言圣经(卷一)
  2. SQL Serve里你总要去改变的3个配置选项
  3. mysql索引_mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结)
  4. BSP tag in CRM and JSP tag in Hybris
  5. 用java编写一个计算器_用java程序编写一个计算器
  6. 如何将HBuilder中的项目Push至Gitee中!
  7. 惠而浦:使用Netty和Kafka的微服务
  8. matlab中if可以判断或语句吗,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?...
  9. 【转】AsyncTask的用法
  10. sql 数据库恢复挂起
  11. pytorch固定BN层参数
  12. 常来长安——西安游记(我愿称之为博物馆七日游)
  13. html简洁漂亮的个人简历,个人主页,个人简介网页版(源码)
  14. Java Swing教程(基础)
  15. 爪哇国新游记之十三----XML文件读写
  16. day01在线教育行业介绍(01)
  17. 蓝桥杯三羊生瑞气,暴力破解
  18. 图书馆炭火盆旁边的数学遐想
  19. CCNA-NAT协议 静态NAT 动态NAT(多对多) PAT(多对一) 内网与外网之间的通信 GNS3实验验证
  20. Java中输出时区的缩写_Java中的时区转换小结

热门文章

  1. 相对路径的当前目录、上级目录、下级目录怎么表示?
  2. EF框架的优点是什么?
  3. 什么是性能测试?这些你都知道吗?
  4. 【Python】Remi构建简单网页
  5. 用”钉钉“做班级直播(快速操作指南)
  6. pecs_Java 泛型: 什么是PECS - 穿梭于偶然
  7. EOP对于邮件头的迷之操作
  8. 美团 MT1最大差值
  9. ddmlib中IDevice的createForward的讲解
  10. matlab cellfun,函数句柄如何传入参数