c语言线性表拷贝,数据结构(C语言版)---线性表顺序存储表示

1、顺序表:线性表的顺序存储,用一组地址连续的存储单元存储线性表中的数据元素。

1) 特点:随机访问,即通过首地址和元素序号可在时间O(1)内找到指定元素。

表中元素的逻辑顺序与其物理顺序相同,线性表中元素的位序是从1开始的。

2)存储位置的关系:假设线性表的每个元素占用l个存储单元

LOC(ai+1)=LOC(ai)+l、LOC(ai)=LOC(a1)+(i-1)*l,其中LOC(a1)为线性表的起始位置或基地址。

2、顺序表的空间分配方式:

1)静态分配:

#define MaxSize 50

typedef struct {

int data[MaxSize];

int length;

}Sqlist;

2)动态分配:

#define InitSize 100//表长度的初始定义

typedef struct {

int *data;//指示动态分配数组的指针

int maxsize, length;//数组的最大容量和当前个数

}SeqList;

3、插入操作:假设线性表中有n个元素,将元素e插入到顺序表L中第i个位置。

bool ListInsert(Sqlist &L, int i, int e)

{

if (i<1 || i>L.length + 1)

{

return false;

}

if (L.length >= MaxSize)

{

return false;

}

for (int j = L.length;j>=i;j--)

{

L.data[j] = L.data[j - 1];

}

L.data[i - 1] = e;

L.length++;

return true;

}

最好情况:在表尾插入数据,元素后移语句将不执行,时间复杂度为O(1)。

最坏情况:在表头插入数据,元素后移语句将执行n次,时间复杂度为O(n)。

平均情况:元素平均移动次数为n/2,平均时间复杂度为O(n)。

4、删除操作:假设线性表中有n个元素,删除顺序表L中第i个位置的元素,并用e返回其值。

bool ListDelete(Sqlist &L, int i, int &e)

{

if (i < 1 || i >= L.length)

{

return false;

}

e = L.data[i - 1];

for (int j = i; j < L.length; j++)

{

L.data[j - 1] = L.data[j];

}

L.length--;

return true;

}

最好情况:删除表尾数据,元素移动语句将不执行,时间复杂度为O(1)。

最坏情况:删除表头数据,需移动除第一个元素外的所有元素,时间复杂度为O(n)。

平均情况:元素平均移动次数为(n-1)/2,平均时间复杂度为O(n)。

5、按值查找(顺序查找):假设线性表中有n个元素,在顺序表L中查找第一个元素值等于e的元素,并返回位序。

int LocateElem(Sqlist L, int e)

{

int i;

for (i = 0; i < L.length; i++)

{

if (L.data[i] == e)

{

return i + 1;

}

}

return 0;

}

最好情况:查找的元素在表头,仅比较一次,时间复杂度为O(1)。

最坏情况:查找的元素在表尾,需比较n次,时间复杂度为O(n)。

平均情况:元素平均移动次数为(n+1)/2,平均时间复杂度为O(n)。

6、逆置顺序表L

void Reverse(Sqlist &L)

{

int temp;

for (int i = 0; i < L.length / 2; i++)

{

temp = L.data[i];

L.data[i] = L.data[L.length - i - 1];

L.data[L.length - i - 1] = temp;

}

}

7、将线性表(a1,a2,...,am,b1,b2,...,bn)换成(b1,b2,...,bn,a1,a2,...,am)

void reverse(int A[], int left, int right, int arraysize)

{

if (left >= right || right >= arraysize)

{

return;

}

int mid = (left + right) / 2;

for (int i = 0; i <= mid - left; i++)

{

int temp = A[left + i];

A[left + i] = A[right - i];

A[right - i] = temp;

}

}

void exchange(int A[], int m, int n, int arraysize)

{

reverse(A, 0, m + n - 1, arraysize);

reverse(A, 0, n - 1, arraysize);

reverse(A, n, m + n - 1, arraysize);

}

8、删除线性表中所有值为x的数据元素,两种方法

void delx1(Sqlist &L, int x)

{

int k = 0;

for (int i = 0; i < L.length; i++)

{

if (L.data[i] != x)

{

L.data[k] = L.data[i];

k++;

}

}

L.length = k;

}

void delx2(Sqlist &L, int x)

{

int k = 0, i = 0;

while (i

{

if (L.data[i] == x)

{

k++;

}

else

{

L.data[i - k] = L.data[i];

}

i++;

}

L.length = L.length - k;

}

9、删除顺序表L中最小值元素结点,并通过引用型参数e返回其值

bool DelMin(Sqlist &L, int &e)

{

if (L.length == 0)

{

return false;

}

e = L.data[0];

int pos = 0;

for (int i = 1; i < L.length; i++)

{

if (L.data[i] < e)

{

e = L.data[i];

pos = i;

}

}

L.data[pos] = L.data[L.length - 1];

L.length--;

return true;

}

10、删除顺序表L中值在s和t中的元素

bool delst(Sqlist &L,int s, int t)

{

int i, k = 0;

if (L.length == 0 || s >= t)

{

return false;

}

for (i = 0; i < L.length; i++)

{

if (L.data[i] >= s && L.data[i] <= t)

{

k++;

}

else

{

L.data[i - k] = L.data[i];

}

}

L.length -= k;

return true;

}

11、在有序的顺序表L中删除s和t之间的所有元素

bool delst2(Sqlist &L, int s, int t)

{

int i, j;

if (s >= t || L.length == 0)

{

return false;

}

for (i = 0; i < L.length&&L.data[i] < s; i++);//值大于s的第一个元素

if (i >= L.length)

{

return false;

}

for (j = i; j < L.length&&L.data[j] <= t; j++);//值大于t的第一个元素

for (; j < L.length; i++, j++)

{

L.data[i] = L.data[j];

}

L.length = i;

return true;

}

12、在有序顺序表L中删除值相同的元素

bool delsame(Sqlist &L)

{

if(L.length == 0)

{

return false;

}

int i, j;

for (i = 0, j = 1; j < L.length; j++)

{

if (L.data[i] != L.data[j])

{

L.data[++i] = L.data[j];

}

}

L.length = i + 1;

return true;

}

13、将有序表A和B合并为新的有序表C

bool Merge(Sqlist A, Sqlist B, Sqlist &C)

{

if (A.length + B.length > MaxSize)

{

return false;

}

int i = 0, j = 0, k = 0;

while (i < A.length&&j < B.length)

{

if (A.data[i] <= B.data[j])

{

C.data[k++] = A.data[i++];

}

else

{

C.data[k++] = B.data[j++];

}

}

while (i < A.length)

{

C.data[k++] = A.data[i++];

}

while (j

{

C.data[k++] = B.data[j++];

}

C.length = k;

return true;

}

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

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

相关文章

nifty ui_Nifty JUnit:在方法和类级别上使用规则

nifty ui如Nifty JUnit&#xff1a;使用临时文件一文中所示 &#xff0c;可以在JUnit测试中使用Rule &#xff0c;这是方法级别的规则。 在此示例中&#xff0c;我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法&#xff08;就像Before &#xf…

在switch语句中,case后的标号只能是什么?

switch语句用于基于不同条件执行不同动作。语法格式&#xff1a;switch (变量表达式){case 常量1: 语句;break;case 常量2: 语句;break;case 常量3: 语句;break;...case 常量n: 语句;break;default: 语句;break;}switch语句是一个条件选择语句&#xff0c;找到相同的…

android+动画+锯齿,Android当中的防锯齿(Bitmap Canvas )

在Android中&#xff0c;目前&#xff0c;我知道有两种出现锯齿的情况。① 当我们用Canvas绘制位图的时候&#xff0c;如果对位图进行了选择&#xff0c;则位图会出现锯齿。② 在用View的RotateAnimation做动画时候&#xff0c;如果View当中包含有大量的图形&#xff0c;也会出…

osgi:install_OSGi服务测试助手:ServiceRegistrationRule

osgi:installOSGi服务测试可以是避免与悬挂的服务引用有关的问题的有效方法。 就像我在写简单服务贡献验证中所承诺的那样&#xff0c;这次我引入了一个JUnit规则 &#xff0c;该规则有助于测试组件之间的交互。 OSGi服务测试组件交互 假设我们有一个服务&#xff0c;该服务通…

C语言——结构体链表,附完整示例

引用自身的结构体&#xff0c;一个结构体中有一个或多个成员的基类型就是本结构体类型时&#xff0c;说明这个结构体可以引用自己&#xff0c;所以称作引用自身的结构体。例如下面的结构体&#xff1a;struct link{ char ch; struct link *p} a;p是一个可以指向struct link类型…

android 注解点击事件,android click事件注解

定义注解&#xff1a;package com.fyfeng.android.annotations;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;Retention(value RetentionPolicy.RUNTIME…

jax-rs jax-ws_快速浏览JAX-RS请求与方法匹配

jax-rs jax-ws在本文中&#xff0c;我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常&#xff0c;使用JAX-RS API的开发人员不会接触&#xff08;或真正不需要知道&#xff09; 匹配过程的细节&#xff0c;请放心&#xff0c;由于我们的RES…

C语言知识总结——宏,枚举

1、define宏定义以#号开头的都是编译预处理指令&#xff0c;它们不是C语言的成分&#xff0c;但是C程序离不开它们&#xff0c;#define用来定义一个宏&#xff0c;程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时&#xff0c;常量表中并没有用define定义的…

C语言知识总结——共用体

union 共用体&#xff08;联合体&#xff09;在进行某些算法的C语言编程的时候&#xff0c;需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术&#xff0c;几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构&#xff0c;在C语言中 以关键字union…

jboss入门_JBoss Forge NetBeans集成–入门

jboss入门JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此&#xff0c;它已经具有了令人敬畏的功能&#xff0c;使您作为开发人员的生活更加轻松。 在大多数情况下&#xff0c;使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多方法可以开始使用Forge基础知识…

这几道 C/C 题涉及你的知识盲区?

8个C语言面试题&#xff0c;涉及指针、运算、函数、内存&#xff0c;看看你能做出几个&#xff01;1.gets()函数问&#xff1a;请找出下面代码里的问题&#xff1a;#include int main(void) {char buff[10];memset(buff, 0, sizeof(buff));gets(buff); //gets不检查输入的字符…

logback redis_使用Spring Boot和Logback登录到Redis

logback redis在进行集中式日志记录时&#xff0c;例如使用Elasticsearch&#xff0c;Logstash和Kibana或Graylog2&#xff0c;您可以为Java应用程序提供多个选项。 您既可以编写标准的应用程序日志&#xff0c;也可以使用Logstash解析这些日志&#xff0c;这些日志既可以直接使…

荣耀6plus+android5.1,荣耀66Plus EMUI3.0开发版5.5.1版本发布说明

本帖最后由 秀姬 于 2015-6-8 11:22 编辑EMUI 3.0_Android4.4_5.5.1版本发布说明(开发版)适配机型&#xff1a;荣耀6 / 荣耀6 Plus 全系列机型下载地址&#xff1a;荣耀6标配版支持荣耀6手机全系列机型&#xff0c;不区分制式&#xff01;标配版支持L0X的各机型升级&#xff0c…

C 与 C 的真正区别在哪里?

C 与 C 的真正区别在哪里&#xff1f;C是中餐厨师的菜刀&#xff0c;做啥菜就那一把刀&#xff0c;切菜切肉切鱼&#xff0c;都是这一把刀&#xff0c;刀工好的师傅&#xff0c;豆腐都能切成一朵花。无论你提什么概念&#xff0c;都能用指针给你做出来&#xff0c;如果不行&…

byteman_Byteman –用于字节码操纵的瑞士军刀

byteman我正在与JBoss中的许多社区一起工作&#xff0c;有很多有趣的事情要谈论&#xff0c;以至于我无法将自己的每一分都缠住。 这就是为什么我非常感谢有机会不时地欢迎客座博客的主要原因。 今天是Jochen Mader&#xff0c;他是以代码为中心的书呆子群的一部分。 他目前花费…

html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】

当表格往上滚动的时候&#xff0c;表头固定不动&#xff0c;这样可以让用户时刻看清每一列的数据含义&#xff0c;这是人性化的设计&#xff0c;充分考虑了用户使用体验。本文将通过5个实例&#xff0c;来介绍这种表格设计。用户可通过下载源码&#xff0c;直接应用于自己的项目…

C语言变量的定义包括变量存储类型和变量的什么?

C语言变量的定义包括变量存储类型和变量的名称。C语言定义变量的格式&#xff1a;“数据类型 变量名;”&#xff0c;“数据类型”表示想要存储什么类型的数据&#xff0c;“变量名”就是你想给这个变量起个什么名字&#xff0c;通常都是用字母。变量的定义定义变量的格式非常简…

java 调用祖父方法_在Java中调用祖父母方法:您不能

java 调用祖父方法在文章保护的重点中&#xff0c;我详细介绍了“受保护”如何扩展“包私有”访问。 我在那儿写道&#xff1a; 你能做的是 覆盖子类中的方法或 使用关键字super调用parent方法。 通常&#xff0c;这实际上是您可以使用受保护的方法完成的所有操作。 &…

C语言代码注释必须用/**/ , 你没看错~

事情是这样的&#xff0c;有人离职&#xff0c;公司调我补缺。那个系统一直有个工程师在维护&#xff0c;参与该系统的新人来了又走&#xff0c;他始终泰然自若。刚过去一个礼拜&#xff0c;我就心下窃吼&#xff1a;“坑爹啊!”&#xff0c;也彻底体会到什么叫---绝对的权威、…

java8 streams_另一个Java 8 Lamdbas和Streams示例

java8 streams我一直落后于Java 8所关注的功能&#xff0c;因此在这篇文章中&#xff0c;我将简要介绍我对lambda和stream的初步经验。 和往常一样&#xff0c;我将专注于Podcast课程&#xff1a; package org.codingpedia.learning.java.core;import java.util.Comparator;p…