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

目录

一、线性表例题: 

二、分配动态内存:

   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.hqwc.cn/news/53146.html

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

相关文章

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述&#xff1a; 二、案例实验&#xff1a; 1、-P选项&#xff0c;随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port&#xff0c;任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

嵌入式面试刷题(day3)

文章目录 前言一、怎么判断两个float是否相同二、float数据可以移位吗三、数据接收和发送端大小端不一致怎么办四、怎么传输float类型数据1.使用联合进行传输2.使用字节流3.强制类型转换 总结 前言 本篇文章我们继续讲解嵌入式面试刷题&#xff0c;给大家继续分享嵌入式中的面…

分布式异步任务处理组件(七)

分布式异步任务处理组件底层网络通信模型的设计--如图&#xff1a; 使用Java原生NIO来实现TCP通信模型普通节点维护一个网络IO线程&#xff0c;负责和主节点的网络数据通信连接--这里的网络数据是指组件通信协议之下的直接面对字节流的数据读写&#xff0c;上层会有另一个线程负…

嵌入式该往哪个方向发展?

1. 你所在的城市嵌入式Linux岗位多吗&#xff1f;我觉得这是影响你做决定的另一个大问题。我们学嵌入式Linux这门技术&#xff0c;绝大部分人是为了从事相关的工作&#xff0c;而不是陶冶情操。但是根据火哥统计来看&#xff0c;嵌入式Linux的普遍薪资虽然高于单片机&#xff0…

把几个Cad图纸 合并到一个Cad文件。但是不同图纸比例不一致,怎么调成一样大--推荐

把几个Cad图纸 合并到一个Cad文件。但是不同图纸比例不一致&#xff0c;怎么调成一样大; 一、需求&#xff1a; 最近在做cad画图纸的过程中&#xff0c;需要在不同的图上获取“框图”&#xff0c;但是复制到当前的cad中后&#xff0c;大小&#xff0c;比例都是变了&#xff0c…

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…

Windows下安装Spark(亲测成功安装)

Windows下安装Spark 一、Spark安装前提1.1、JDK安装&#xff08;version&#xff1a;1.8&#xff09;1.1.1、JDK官网下载1.1.2、JDK网盘下载1.1.3、JDK安装 1.2、Scala安装&#xff08;version&#xff1a;2.11.12&#xff09;1.2.1、Scala官网下载1.2.2、Scala网盘下载1.2.3、…

LLVM笔记1

参考&#xff1a;https://www.bilibili.com/video/BV1D84y1y73v/?share_sourcecopy_web&vd_sourcefc187607fc6ec6bbd2c74a3d0d7484cf 文章目录 零、入门名词解释1. Compiler & Interpreter2. AOT静态编译和JIT动态解释的编译方式3. Pass4. Intermediate Representatio…

AirLink 101 Wireless N 150 PCI Adapter驱动和管理软件

从光盘里拷出来的&#xff0c;界面比较复古&#xff0c;实际功能聊胜于无 链接&#xff1a;https://pan.baidu.com/s/1clUcp7QsF8QMWdGoZkc_dQ?pwdmkra 提取码&#xff1a;mkra

开放式耳机怎么样?值得入手的开放式耳机推荐

​蓝牙耳机是现代音乐爱好者不可或缺的装备&#xff0c;近几年热门的开放式耳机似乎更受大家热爱&#xff0c;它们能够带来更加清晰、自然的声音体验&#xff0c;同时还能让你在听音乐时保持一定的舒适度。那么&#xff0c;都有哪些好用的开放式耳机呢&#xff1f;希望通过今天…

记录--基于css3写出的流光登录(注释超详细!)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式&#xff0c;外层用了div进行包裹&#xff0c;重点是运用了两个i元素在后期通过css样式勾画出一条线没在聚焦文本框的时候线会过度成一个…

【前端】对前端小白极为友好的JS DOM入门文章

在现代web开发中&#xff0c;JavaScript (JS) 是不可或缺的一部分&#xff0c;它使我们能够为网页赋予交互性和动态性。其中&#xff0c;DOM&#xff08;文档对象模型&#xff09;技术在前端开发中起着至关重要的作用。本篇博客将带领前端初学者深入理解JavaScript DOM技术&…