数据结构--线性表2-2

news2024/11/15 8:42:48

目录

一、线性表例题: 

二、分配动态内存:

   1.动态创建一个空顺序表的算法:

 2.动态顺序表的插入算法:

3.动态顺序表的删除 

 三、线性表的链式表示和实现

 例题1:创建链表并插入26个字母

例题2:在链表中取第i个数据元素

例题3:在链表中删除一个结点

四、静态链表:


一、线性表例题: 

例题1:求两个线性表的“并”,即LA U LB= ?

算法思路:

注意集合并的含义:

LA和LB都是无序表,则从LB种取元素逐一与LA中所有元素比较,相同则不插入LA中;

Void Union(List &LA,List LB)

{//将所有在线性表Lb中但不在La中的数据元素插入到La中

        La_len=Listlength(La);

        Lb_len=Listlength(Lb);

        for(i=1;i<Le_len;i++)

        {

                GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e、

                if(!LocateElem(La,e,equal))

                {

                        ListInsert(La,++La_len,e);

                }

        }

}

算法复杂度分析:LocateElem(La,e,equal) 需La_len次比较

则整个算法需O(La_len×Lb_len) 

 例题2:设正整数a的前驱为PRIOR(a),后继NEXT(a),用递归算法计算a+b。

        首先要对加法算法进行描述。不能用简单的加法语句,因为没有加法,要考虑如何用给出的两个特定函数来实现a+b?

思路:  考虑加法的定义,若用数轴来描述a+b,当a不断往"0"移动,b不断往相反方向移动的过程。当a移动到0时,b指向的位置即为a+b。

 (a可视为一减计数器,前移过程中不断递减,而b的后移则是不断加1的过程)

平常我们可以用循环来实现,但根据本题题意不能用循环,而要用递归。

设计要点有二:1.递归算法的形式化描述;2.不能无限制递归,一定要有终止条件。

结果:

int add(int a,int b);

if(a==0)   return(b);

else return (add(prior(a),next(b))); 

若a很大,b很小怎么办?

解决方法:就从小的开始进行减计数。

二、分配动态内存:

(我的C语言专栏中介绍过基础,这里跟数据结构一起编写一些)

#define LIST_INIT_SIZE	100//存储空间的初始分配量 
#define LISTINCREMENT 	10//存储空间的分配增量
Typedef struct{
ElemType *elem;		//表基址(用指针*elem) 
int 	lenght;		//表长度(表中有多少个元素) 
int 	listsize;	//当前分配的表尺寸(字节单位) 
}SqList L; 

   1.动态创建一个空顺序表的算法:

Status InitList_Sq(SqList &L)

{

        L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));

        if(!L.elem) exit(OVERFLOW);//分配失败,结束程序

        L.length=0;                                //暂无元素放入,空表

        L.listsize = LIST_INIT_SIZE;        //表尺寸=初始分配量

        Return       OK;

}//InitList_Sq

 2.动态顺序表的插入算法:

Status ListInsert_Sq(SqList &L,int i,ElemType e)

{//在顺序线性表中第i个位置之前插入新的元素e

    if(i<1||i>L.length+1) return ERROR;//检验i值得合法性

    if(L.length>=L.listsize)//若表长超过表尺寸则要增加尺寸

        {

                newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//realloc(*p,newsize)函数的意思是:新开一片大小为newsize的连续空间,并把以*p为首地址的原空间数据都拷贝进去。

        if(newbase = NULL) exit(OVERFLOW);        //分配失败则退出报错

        L.elem = newbase;                        //重置新基址

        L.listsize = L.listsize +LISTINCREMENT;}//增加表尺寸

        q=&L.elem[i-1];                //q为插入位置。这里没有头结点的情况

        for(p=L.elem[L.length-1];p>=q;--p)  *(p+1)=*p;

//插入位置及之后的元素统统后移,p为元素位置

        *q = e;        //插入e

        ++L.length;        //增加1个数据元素,则表长+1

        return OK;

        }//ListInsert_Sq

}

3.动态顺序表的删除 

Status ListDelete_Sq(SqList &L,int i,ElemType &e) 
{//在顺序表L中删除第i个元素,用e返回其值 
	if(i<1||L.length) return ERROR;//i值不合法,返回 
	p=&L.elem[i-1];			//p是被删除元素的位置 
	e=*p;					//被删除元素的值赋给e 
	q=L.elem+L.length-1;	//q是表尾的位置 
	for(++p;p<=q;p++)		 
	*(p-1)=*p;				//待删除元素后面的统统前移
	--L.length;				//表长-1 
	return ok;
}//ListDelete_Sq 

 三、线性表的链式表示和实现

1、链表的表示

(1)链式存储结构特点:

其结点在存储器总的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。

设计效率:牺牲空间效率换取时间效率

头指针:是指向链表中第一个结点(或为头结点、或为首结点)的指针;

头结点:是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,它不计入表长度;

首元结点:是指链表中存储线性表第一个数据元素a1的结点。 

Typedef struct Lnode{
ElemType  data;		//数据域 
struct Lnode *next;	//指针域 
}Lnode,*LinkList; 	//*LinkList为Lnode类型的指针 

 例题1:创建链表并插入26个字母

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
	char data;
	struct node *next;
}node;

node *p,*q,*head;
int n;
int m=sizeof(node);

void build()		//字母链表的生成。要一个个慢慢链入 
{
	int i;
	head=(node*)malloc(m);// 
	p=head;
	for(i=1;i<26;i++)//因尾结点要特殊处理,故i≠26 
	{
		p->data=i+'a'-1;//第一个结点值为字符a 
		p->next=(node*)malloc(m);//为后继结点“挖坑” 
		p=p->next;	//让指针变量p指向后一个结点 
	}
	p->data=i+'a'-1;//最后一个元素要单独处理 
	p->next=NULL;	//单链表尾结点的指针域要置空 
 } 
 
void display()//字母链表的输出 
{
	p=head;
	while(p)//当指针不空时循环(仅限于无头结点的情况) 
	{
		printf("%c",p->data);
		p=p->next;
	}
 } 
 
 int main(void)
 {
 	build();
 	display();
  } 

例题2:在链表中取第i个数据元素


Status GetElem_L(Linklist L,int i,ElemType &e)
{//L为带头结点的单链表的头指针
 //当第i个元素存在时,其值赋给e并返回OK,否则返回error 
	p=L->next;j=1;
//初始化,p指向第一个结点,j为计数器 
	while(p&&j<i)
	{
//顺指针向后查找,直到p指向第i个元素或p为空 
		p=p->next;++j;
	}
//第i个元素不存在 
	if(!p||j>i) return ERROR;
	e=p->data;//取第i个元素 
	return ok;
}GetElem_L

例题3:在链表中删除一个结点

Status ListDelete_L(Linklist &L,int i,ElemType e)
{//在带头结点的单链表L中,删除第i个元素,并由e返回其值 
	p=L;j=0;
	while(p->next&&j<i-1)
	{//寻找第i个结点,并令p指向其前驱 
		p=p->next;++j;
	 } 
	 if(!(p->next)p||j>i-1)	return ERROR;//删除不合理位置 
	 q=p->next;
	 p->next=q->next;//删除并释放结点 
	 e=q->data;free(q);
	 return ok;
 } 

四、静态链表:

        定义一个结构型数组(每个元素都含有数据域指示域),就可以完全描述链表,指示域就相当于动态链表的指针,称为游标

静态链表的类型定义如下:

#define MAXSIZE 1000 //预分配最大的元素个数(连续空间)

typedef  struct {

        ElemType  data;        //数据域

        int              cur;          //指示域

}component,SLinkList[MAXSIZE];        //这是一维结构型数组

例题4:利用静态链表存储s=(zhao,qian,sun,li,zhou,wu)。

其原理跟动态差不多,写法类似,知识不需要在使用指针。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伺服电机的三种控制方式与三闭环控制

&#xff08;项目&#xff09;FPGA双电机主从快速稳定控制实现 第一章 伺服电机的三种控制方式与三闭环控制 伺服电机的三种控制方式与三闭环控制 &#xff08;项目&#xff09;FPGA双电机主从快速稳定控制实现前言一、电机控制方式二、电机三个闭环负反馈PID控制系统三、三闭…

LeetCode513. 找树左下角的值

513. 找树左下角的值 文章目录 [513. 找树左下角的值](https://leetcode.cn/problems/find-bottom-left-tree-value/)一、题目二、题解方法一&#xff1a;递归法&#xff08;层序遍历&#xff0c;深度优先搜索&#xff09;**不足之处以及如何改进** 方法二&#xff1a;迭代 一、…

2023年08月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

三、文件与路径

1、隐藏文件与非隐藏文件 1.1、概念 (1)隐藏文件默认情况下看不到&#xff0c;需要进行相应设置才能看到。非隐藏文件默认情况下就能看到 1.2、Windows中的文件 (1)非隐藏文件设置为隐藏文件。选中文件&#xff0c;鼠标右键→属性&#xff0c;勾选隐藏。 (2)产看隐藏文件。…

资产盘点设备包括哪些

根据资产管理系统的卡账表和计算机设备管理系统的验证&#xff0c;固定资产的账卡完成一致&#xff1b;根据上级领导机构发布的资产盘点标示&#xff0c;固定资产。低价值易耗品进行标签贴绑&#xff0c;完成帐实一致&#xff0c;真实反映本行固定资产实物情况。   RFID固定…

RocketMQ 事务消息

事务消息是 RocketMQ 的高级特性之一 。这篇文章&#xff0c;笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子&#xff1a;用户购物车结算时&#xff0c;系统会创建支付订单。 用户支付成功后支付订单的状态…

论测试猿如何优雅的甩锅

测试猿&#xff0c;经常被江湖人戏称为“背锅侠”。 这个称呼是怎么来的呢&#xff1f;我们来追溯一下根源。 当产品上线后&#xff0c;有 bug&#xff1a; “测试为什么没有测试发现这个问题&#xff1f;肯定是测试的责任&#xff01;” 当产品上线后&#xff0c;用户反馈…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、报错信息三、总结 一、报错信息 这里&#xff0c;nginx给出以下错误信息&#xff1a; Windows&#xff1a;nginx: [error] CreateFile() “/logs/nginx.pid“ failed (2: The system&#xff09; 经分析&#xff0c;造成上述错误的本…

小研究 - 领域驱动设计DDD在IT企业内部网站开发中的运用(一)

在企业内部网站的建设过程中&#xff0c;网站后端最初采用传统的表模式的开发方式。这种方式极易导致站点的核心业务逻辑和业务规则分布在架构的各个层和对象中&#xff0c;这使得系统业务逻辑的复用性不高。为了解决这个问题&#xff0c;作者在后期的开发过程中引入了领域驱动…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

2023华数杯数学建模竞赛选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;隔热材料的结构优化控制研究 A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。 其中第一问需要建立平纹织物整体热导率与单根纤…

知识区博主转型——兼做知识区和改造区博主!!!!!

想脱单的进来&#xff0c;一起交流如何能脱单&#xff01;&#xff01;&#xff01; 为什么——我太羡慕有对象的人了哭死&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 你是不是很羡慕别人怎么都有女朋友 别人家的女朋友怎么都那么好&#xff…

用户权限管理是保证企业图文档安全最有效的策略

企业拥有大量的图文档数据&#xff0c;涉及多个部门和员工&#xff0c;因此需要建立有效的用户权限管理策略&#xff0c;以保护图文档的安全。智橙平台将在线图文档管理与BOM系统的融合应用为企业提供了强大的权限管理功能&#xff0c;能够确保只有授权用户能够访问和编辑特定的…

【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基础介绍应用场景登场角色 案例实现案例一实现 案例二实现 迭代器模式在JDK源码中的应用总结文章说明 案例引入 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一…

小白如何获取CNVD事件型原创漏洞证明?——记CNVD漏洞挖掘思路

引子: 相信许多人都想要被别人叫做大佬&#xff0c;漏洞挖掘当中肯定也不例外,所以在此之前让我们康康度娘对大佬的定义:形容一个人很巨表示对其顶礼膜拜的态度。在这种情况下&#xff0c; 国家信息安全漏洞共享平台(CNVD) 则为我们提供了一个成为大佬的平台, CNVD作为国内最具…

【javaSE】 实现图书管理系统

目录 整体思路 Book包 Book类 BookList类 user包 User类 NormalUser类 AdminUser管理员类 testmain包 opera包 IOPeration接口 普通用户 ExitOperation类 FindOperation类 BrrowOperation类 ReturnOperation类 管理员 AddOperation类 DelOperation类 ShowOp…

小白科普-通信网中核心网、城域网、接入网

通信网络的一个整体结构&#xff0c;大致包括&#xff1a;骨干网、核心网、城域网、接入网&#xff0c;其中接入网又分为无线接入和有线接入&#xff0c;以及承载网。 听起来很复杂&#xff0c;我们再分解来看看。 从最靠近用户端开始的是接入网。接入网&#xff0c;简单点来…

迁移学习(新人必看)

先说一下深度学习常见的问题&#xff1a; 1.数据集不够&#xff0c;通常用数据增强解决。 2.参数难以确定&#xff0c;训练时间长&#xff0c;这就需要用迁移学习来解决 什么叫迁移学习呢&#xff1a;比方说有一个对100w的自行车数据集&#xff0c;并用VGG模型训练好的网络&…

【前端】网页

1 网页的相关概念 1.1什么是网页 网站 &#xff1a;是网页的集合 网页 &#xff1a;通常是HTML格式的文件&#xff0c;通过浏览器来阅读 网页是构成网站的基本要素&#xff0c;它通常由图片、链接、文字、声音、视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或…