一,链式存储结构

    结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻        用一组物理位置任意的存储单元来存放线性表的数据元素,存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
各结点由两个域组成:数据域:存储元素数值数据指针域:存储直接后继点的存储位置

二、单链表

结点只有一个指针域的链表,称为单链表。

三、代码

1、函数结果代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//函数结果状态代码
#define TURE    1
#define FALSE   0
#define OK      1
#define ERROR   0
#define OVERFLOW    -2
#define MAXSIZE     100
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char ElemType;

2、单链表的存储结构

typedef struct node {int data;//数据struct node* next;//next的类型是指向本结构体类型的指针类型
}LNode, * LinkList;//单链表的初始化
Status InitList(LinkList& L)
{L = new LNode;L->next = NULL;return OK;
}

3、单链表的销毁

//销毁单链表
//从头指针开始,依次释放所有结点
Status DestroyList_L(LinkList& L)
{LNode* p;  //或LinkList p;while (L){p = L;L = L->next;delete p;}return OK;
}

4、清空链表

            链表仍存在,但链表中无元素,成为空链表

//清空链表L
Status ClearList(LinkList& L)
{LNode* p, * q;p = L->next;while (p)        //没到表尾{q = p->next;delete p;p = q;}L->next = NULL;     //头结点指针域为空return OK;
}

5、求单链表的表长

            从首元结点开始,依次计数所有结点

//求单链表L的表长
int ListLength_L(LinkList L)
{       //返回L中数据元素的个数LinkList p;p = L->next;    //p指向第一个结点int i = 0;while (p)  //遍历单链表统计结点数{i++;p = p->next;}return i;
}

6、取单链表中第i个元素的内容

            例如:取出表中第3个元素。                    i=3

                从链表的头指针开始,顺着链域next逐个结点往下搜索,直到搜索到第i个结点为止。【算法步骤】1.从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值p=L->next。2.j做计数器,累计当前扫描过的结点数,j初值为1.3.当p指向扫描到的下一结点时,计数器j加1.4.当j==i时,p所指向的结点就是要找的第i个结点。
//获取线性表L中的某个数据元素的内容,通过变量e返回
Status GetElem_L(LinkList L, int i, ElemType& e)
{   LinkList p;p = L->next;int j = 1;while (p && j < i) {   //向后扫描,直到p指向第i个元素或p为空p = p->next;++j;}if (!p || j > i)return ERROR; //第i个元素不存在e = p->data;  //取第i个元素return OK;
}

7、在线性表L中查找值e的数据元素

            按值查找——根据指定数据获取该数据所在的位置(地址)

     【算法步骤】1.从第一个结点起,依次和e相比较2.如果找到一个其值与e相等的数据元素,则返回其链表中的“位置”或地址;3.如果查遍整个链表都没有找到其值和e相等的元素,则返回0或“NULL”。
//在线性表L中查找值e的数据元素
//找到,则返回L中值为e的数据元素的地址,查找失败返回NULL
LNode* LocateElem_L(LinkList L, ElemType e)
{LinkList p;p = L->next;while (p && p->data != e)p = p->next;return p;
}

8、插入——第i个结点前插入值为e的新结点

        【算法步骤】1.首先找到ai-1的存储位置p。2.生成一个数据域为e的新结点s。3.插入新结点:a.新结点的指针域指向结点aib.结点ai-1的指针域指向新结点
//在L中第i个元素前插入数据元素e
Status ListInest_L(LinkList& L, int i, ElemType e)
{LinkList p = L;int j = 0;while (p && j < i - 1){      //寻找第i-1个结点,p指向i-1结点p = p->next;++j;}if (!p || j > i - 1){      //i大于表长+1或者小于1,插入位置非法return ERROR;}LinkList s = new LNode; //生成新结点ss->data = e;    //将结点s的数据域置为es->next = p->next;      //将结点s插入L中p->next = s;return OK;
}

9、删除——删除第i个结点

         【算法步骤】1.首先收到ai-1的存储位置p,保存的ai的值。2.令p->next指向ai+1。3.释放结点ai的空间
//将线性表L中第i个数据元素删除
Status ListDelete_L(LinkList& L, int i, ElemType& e)
{LinkList p = L;LinkList q;int j = 0;while (p->next && j<i-1){      //寻找第i个结点,并令p指向其前驱p = p->next;++j;}if (!(p->next) || j > i - 1){ //删除位置不合理return ERROR;}q = p->next; //临时保存被删结点的地址以备释放p->next = q->next;  //改变删除结点前驱结点的指针域e = q->data;    //保存删除结点的数据域delete q;       //释放删除结点的空间return OK;
}

10、单链表的建立

10.1、头插法

 建立单链表:头插法——元素插入在链表头部,也叫前插法。1.从一个空表开始,重复读入数据;2.生成新结点,将读入数据存放到新结点的数据域中3.从最后一个结点开始,依次将各结点插入到链表的前端

例如

//头插法
void CreateList_H(LinkList& L, int n)
{L = new LNode;L->next = NULL;     //先建立一个带头结点的单链表LNode *p;int i = 0;for (i = n; i > 0; --i){p = (LNode*)malloc(sizeof(LNode));      //生成新结点scanf("%d", & p->data); //输入元素值p->next = L->next;    //插入到表头L->next = p;}
}

10.2、尾插法

建立单链表:尾插法——元素插入在链表尾部,也叫后插法。1.从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。2.初始时,r同L均指向头结点。每一个读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。

//尾插法——正位序输入n个元素,建立带表头结点的单链表
void CreateList_R(LinkList& L, int n)
{LinkList p;L = new LNode;L->next = NULL;LinkList r = L;  //尾指针r指向头结点int i = 0;for (i = 0; i < n; ++i){p = new LNode;scanf("%d", p->data);       //生成新结点,输入元素值p->next = NULL;r->next = p; //插入到表尾r = p;  //r指向新的尾结点}
}

以上内容都是我听青岛大学王卓老师的课做的笔记,大家有兴趣可以去听哦,讲的非常详细。

数据结构:单链表的基本操作相关推荐

  1. 单链表的基本操作_数据结构-单链表的基本操作

    typedef int ElemType;typedef struct LNode *PtrToNode; struct LNode {ElemType Data;PtrToNode Next; }; ...

  2. 数据结构-单链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...

  3. 数据结构实验3、单链表的基本操作实现

    实验三: 作者说: 写的如果有不太好的地方,欢迎大佬指点! 一.运行效果截图 二.实验要求 实验3.单链表的基本操作实现 (1)实验目的 通过该实验,深入理解链表的逻辑结构.物理结构等概念,掌握链表基 ...

  4. 数据结构——单链表基本操作的实现

    单链表的基本操作的实现 单链表的初始化 判断链表是否为空 单链表的销毁 清空链表 求链表表长 取单链表中第i个元素的内容 根据指定值获取该值所在的位置(地址) 根据指定值获取该值所在的位置序号 插入元 ...

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

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

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

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

  7. 单链表的基本操作(初始化,前插,后插,删除查找,排序)

    /*        // Project: single linkeed list (数据结构 单链表)        // Date:    2021-10-7 09:26:57       // ...

  8. 20175330 数据结构-单链表(选做)

    要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList {     public static void mai ...

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

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

  10. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

最新文章

  1. 重构了一波代码,聊聊后端也聊聊游戏后端
  2. 内容管理系统 Nuxeo认证绕过和RCE漏洞(CVE-2018-16341) 分析
  3. string转map集合_Map、斗地主案例
  4. HALCON示例程序find_pads.hdev通过fit_rectangle2_contour_xld绘制精准轮廓
  5. sharding-jdbc学习
  6. 测试AS3的性能9800粒子
  7. HTML的基本知识-和常用标签-以及相对路径和绝对路径的区别
  8. GFP_KERNEL的作用
  9. 汇编学习--6.13--基础知识
  10. show,hide与fadeIn、fadeOu的区别
  11. windows PC电脑必备3个实用软件
  12. 190529每日一句,放胆去梦想,努力去奋斗
  13. Matplotlib 绘图库从入门到精通
  14. 云打码的简单使用举例
  15. Mongodb之Chunk研究
  16. 数据分析怎么学?我画了一个导图,又找到22本书
  17. 英特尔奔腾芯片漏洞_什么是奔腾(英特尔)?
  18. Quartz定时任务项目中的应用
  19. HBulider X js内存溢出
  20. Android的adb命令 查看sqlite命令

热门文章

  1. 20210330某农业公司前端面试总结
  2. python中的pydoc
  3. mysql ifnull正确使用
  4. 终端电阻对CAN总线的作用和影响
  5. x710 offload QinQ 报文 vlan 并支持 rss hash 到多队列
  6. mysql截取后八位_sql 截取字符串
  7. Linux系统批量释放deleted文件占用的空间
  8. 阿里云云计算架构师认证是什么?(全球第1通关攻略)
  9. 宝塔控制面板常用Linux命令大全
  10. 送给需要剪辑视频的你-----剪辑的软件和录屏的软件,以及格式转换软件,超级好用