数据结构——线性表(二)

线性表顺序存储结构的优缺点

优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间

        2.可以快速的存取表中的任一位置的元素

缺点:1.插入和删除操作需要移动大量的元素

        2.当线性表长度变化较大的时候,难以确定存储空间的容量

        3.造成存储空间的"碎片"

所以我们有了另外一种线性表的存储结构——链式存储结构

链式存储结构

我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域,指针域中存储的信息称作指针或链.这两部分信息组成数据元素ai的存储映像,称为结点(Node)

链表中只含有一个指针域,所以叫做单链表

对于线性表来说,总得有头有尾,链表也不例外,所以我们把链表中的第一个节点的存储位置叫做头指针,整个链表的存取就必须从头指针开始了

而最后一个结点的指针域因为没有指向任何地方所以我们把其置为空,即(NULL)

有时候,我们为了更加方便的对链表进行操作,会在单链表的第一个结点前附设一个结点,成为头结点,头结点的数据域不存储任何数据

头指针与头结点的异同点

1.头指针是指链表指向第一个结点的指针,若链表有头结点,那头指针就是指向头结点的指针,而头结点是为了操作的统一和方便而设立的,其数据域一般无意义,也可以存放链表的长度

2.头指针具有标志作用,所以常用头指针冠以链表的名字

3.无论链表是否为空,头指针均不为空,头指针是链表的必要元素,但是头结点不是链表的必须要素

单链表的定义

typedef struct Node
{ElemType data;struct Node *next;
}Node;
typedef struct Node *LinkList;

单链表的读取

Status GetElem(LinkList L,int i,ElemType *e)
{int j;LinkList p;        //声明一结点pp=L->next;         //让p指向链表L的第一个结点j=1;               //j为计数器while(p && j<i)    //p不为空或者计数器j还没有等一i时,循环继续{p=p->next;     //让p指向下一个结点++j;}if(!p || j>i)return ERROR;  //第i个元素不存在*e=p->data;        //取第i个元素的数据return OK;
}

说白了就是从头开始找,直到第i个结点为止,因此最坏情况的时间复杂度为O(n)

单链表的插入

Status LinkInsert(LinkList *L,int i,ElemType e)
{int j;LinkList p,s;p=*L;j=1;while(p && j<i)                    //寻找第i个结点{p=p->next;++j;}if(!p || j>i)return ERROR;                  //第i个元素不存在s=(LinkList)malloc(sizeof(Node));  //生成新结点s->data=e;s->next=p->next;                   //将p的后继结点赋值给s的后继p->next=s;                         //将s赋值给p的后继return OK;
}

单链表的删除

Status LinkDelete(LinkList *L,int i,ElemType *e)
{int i;LinkList p,q;p=*L;j=1;while(p->next && j<i)        //遍历寻找第i个元素{p=p->next;++j;}if(!(p->next) || j>i)return ERROR;            //第i个元素不存在q=p->next;p->next=q->next;             //将q的后继赋值给p的后继*e=q->data;                  //将q结点中的数据给efree(q);                     //让系统回收此结点,释放内存return OK;
}

对于插入或删除数据越频繁的操作,单链表的效率优势就越明显

单链表整表创建

头插法

void CreateListHead(LinkList *L,int n)
{LinkList p;int i;srand(time(0));                        //初始化随机数种子*L=(LinkList)malloc(sizeof(Node));     (*L)->next=NULL;                       //先建立一个带头结点的单链表for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(Node));  //生成新结点p->data=rand()%100+1;              //随机生成100以内的数字p->next=(*L)->next;(*L)->next=p;                      //插入到表头}
}
尾插法

void CreateListTall(LinkList *L,int n)
{LinkList p,r;int i;srand(time(0));                        //初始化随机数种子*L=(LinkList)malloc(sizeof(Node));     //L为整个线性表r=*L;                                  //r为指向尾部的结点for(i=0;i<n;i++){p=(Node*)malloc(sizeof(Node));     //生成新结点p->data=rand()%100+1;              //随机生成100以内的数字r->next=p;                         //将表尾终端结点的指针指向新结点r=p;                               //将当前新结点定义为表尾的终端结点}r->next=NULL;                          //表示当前链表结束
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578980.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言学习Day2:注释与变量

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、注释①为什么要写注释&#xff1f;②单行注释…

C++11入门手册第一节,学完直接上手Qt(共两节)

入门 hello.cpp #include <iostream>int main() { std::cout << "Hello Quick Reference\n"<<endl; return 0;} 编译运行 $ g hello.cpp -o hello$ ./hello​Hello Quick Reference 变量 int number 5; // 整数float f 0.95; //…

双向长短期BiLSTM的回归预测-附MATLAB代码

BiLSTM是一种带有正反向连接的长短期记忆网络&#xff08;LSTM&#xff09;。 BiLSTM通过两个独立的LSTM层&#xff0c;一个按时间顺序处理输入&#xff0c;另一个按时间倒序处理输入&#xff0c;分别从正向和反向两个方向捕捉输入序列的特征。具体地&#xff0c;正向LSTM按时…

资源免费分享了

为了解决粉丝们在学习过程中&#xff0c;出现没有资料&#xff0c;没有书籍&#xff0c;搜索引擎搜索不精准&#xff0c;没有恰当的博文等这一类情况&#xff0c;今天&#xff0c;我将我曾经的学习资料&#xff0c;免费分享给大家&#xff01; 博主声明:此并非过度宣传&#x…

网络安全-内网DNS劫持-ettercap

前言 一&#xff0c;我也是初学者记录的笔记 二&#xff0c;可能有错误的地方&#xff0c;请谨慎 三&#xff0c;欢迎各路大神指教 四&#xff0c;任何文章仅作为学习使用 五&#xff0c;学习网络安全知识请勿适用于违法行为 学习网络安全知识请勿适用于违法行为 学习网络安全…

.Net 知识杂记

记录平日中琐碎的.net 知识点。不定期更新 目标框架名称(TFM) 我们创建C#应用程序时&#xff0c;在项目的工程文件(*.csproj)中都有targetFramework标签&#xff0c;以表示项目使用的目标框架 各种版本的TFM .NET Framework .NET Standard .NET5 及更高版本 UMP等 参考文档&a…

python实现两个Excel表格数据对比、补充、交叉验证

业务背景 业务中需要用到类似企查查一类的数据平台进行数据导出&#xff0c;但企查查数据不一定精准&#xff0c;所以想采用另一个官方数据平台进行数据对比核验&#xff0c;企查查数据缺少的则补充&#xff0c;数据一致的保留企查查数据&#xff0c;不一致的进行颜色标注。 …

【LeetCode: 面试题 16.05. 阶乘尾数 + 阶乘】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C语言----简单讲解编译与链接

大家好&#xff0c;这次我们来讲讲我们写下代码后&#xff0c;源代码是变为执行文件的&#xff0c;这里我们将会使用用另外一种编译器&#xff08;gcc&#xff09;&#xff0c;但是嘞因为鄙人对电脑的理解还是比较少的&#xff0c;所以对于我们进行对比的编译器&#xff08;gcc…

【Spring】SpringMvc项目当中,页面删除最后一条数据,页面不跳转并且数据为空。

期待您的关注 在之前学习SpringMvc的时候遇到过这样一个BUG&#xff0c;当我在一个页面删除该页面的最后一条数据的时候&#xff0c;一旦我删除成功&#xff0c;那么这个页面不会进行跳转&#xff0c;而是还停留在这个本不应该存在的页面&#xff0c;而且数据什么都没有。如下…

Photoshoot 2(Java)

Photoshoot 2 题目描述 在一个似曾相识的场景中&#xff0c;Farmer John 正在将他的 N 头奶牛&#xff08;1≤N≤10^5&#xff09;排成一排&#xff08;为了方便将它们按 1⋯1⋯N 编号&#xff09;&#xff0c;以便拍照。 最初&#xff0c;奶牛从左到右按照 a1,a2,⋯,aN 的顺…

Vue性能优化--gZip

一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写&#xff0c;最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术&#xff0c;web服务器和客户端&#xff08;浏览器&#xff09;必须共同支持gzip。目前主流的浏览器&#xff0c;Chro…