线性表的练习题的博文链接~~戳这里

文章目录

  • PS:
  • 顺序存储结构 P22
  • 算法2.3 初始化一个顺序表 P23
  • 算法2.4 顺序表插入元素 P24
  • 算法2.5 顺序表删除元素 P25
  • 算法2.6 顺序表中查找元素 P26
  • 算法2.7 顺序表的合并 P26

PS:

关于->.的区别
.表示左边是实体,提取右边的成员。一般用于结构体
->表示左边是指针,提取右边的成员

struct node{int x;
};struct node *a;

a是一个指向结点的指针。
我们要访问x的值,可以写*a.x,也可以写a->x

顺序存储结构 P22

书上P22页,给出了线性表的动态分配顺序存储结构,如下
注意:这里写了一个ElemType,这代表一个元素类型,使用的时候,你可以根据自己需要什么类型来改。

typedef struct{ElemType *elem;    //存储空间基址int lenth;    //当前线性表里面存放数据的长度int listsize; //线性表的容量
}SqlList;

算法2.3 初始化一个顺序表 P23

基于线性表的顺序存储结构,我们写出顺序表的第一个算法,算法2.3,初始化一个顺序表

ps:我写的代码和书上略有出入,是因为书上的是C++伪代码,而我用的C语言实现,所以有些地方会有不同
比如函数形参你会看到书上SqList &L这样写,这是C++里面的引用,而用C语言没有引用,所以改用指针代替,所以导致函数里面的写法也略有不同,这是语言的实现形式不一样,算法原理都一样,所以这些问题,就不再解释了。

/******
author:  1900
language: C
******/
#include<stdio.h>
#include<malloc.h>#define List_Init_Size 100 //初始大小
#define List_Increase  10  //增量typedef struct{int *elem;    //存储空间基址int lenth;    //当前线性表里面存放数据的长度int listsize; //线性表的容量
}SqList;int InitList_Sq(SqList *L){L->elem=(int *)malloc(List_Init_Size*sizeof(int));if(!L->elem){return -1;//申请失败}L->lenth=0;L->listsize=List_Init_Size;return 1;
}
int main(){SqList L;      //声明一个顺序表InitList_Sq(&L);//初始化//将这个顺序表前十个空间,赋值为0-9,并且打印出来for(int i=0;i<10;i++){L.elem[i]=i;L.lenth++;printf("%d ",L.elem[i]);}
}

算法2.4 顺序表插入元素 P24

下面这个例子:
创建了一个空的顺序表,初始空间为10,向其中插入了12个元素(所以用到了申请空间),最后遍历打印!
顺序表插入元素要注意几点:
1、在第i个位置插入元素,下标是i-1
2、所插入位置后边的所有元素都要后移一位
3、要先考虑,空间够不够插入这个元素,若不够,先申请空间
4、移动元素,我用了书上的方法,用双指针移动(其实可以用下标移动的,会简单的多,不过这里为了和书上一致用指针吧。。)

/*
author:  1900
language: C*/
#include<stdio.h>
#include<malloc.h>#define List_Init_Size 10 //初始大小
#define List_Increase  10  //增量
int cnt=0;
typedef struct{int *elem;    //存储空间基址int lenth;    //当前线性表里面存放数据的长度int listsize; //线性表的容量
}SqList;int InitList_Sq(SqList *L){L->elem=(int *)malloc(List_Init_Size*sizeof(int));if(!L->elem){return -1;//申请失败}L->lenth=0;L->listsize=List_Init_Size;return 1;
}
//在第i个位置前插入元素e
int ListInsert_Sq(SqList *L,int i,int e){if(i<1 || i>L->lenth+1) return -1; //位置不合法if(L->lenth>=L->listsize){int *newbase=(int *)realloc(L->elem,(L->listsize+List_Increase)*sizeof(int) );if(!newbase) return -1;L->elem=newbase;L->listsize+=List_Increase;}//用两个指针,一个指向位置i-1,用来插入元素e//另一个指向最后一个位置,用来移动元素int *q=&(L->elem[i-1]);for(int *p=&(L->elem[L->lenth-1]);p>=q;--p){*(p+1)=*p;}*q=e;  //插入元素e++L->lenth;//表长+1return 0;
}
int main(){SqList L;      //声明一个顺序表InitList_Sq(&L);//初始化//刚开始为空  一个一个插入 插入12个数for(int i=1;i<=12;i++){ListInsert_Sq(&L,i,i);  }//遍历for(int i=0;i<12;i++){printf("%d ",L.elem[i]);}
}

算法2.5 顺序表删除元素 P25

下面这个代码,创建了一个顺序线性表,为其前10个空间赋值为0-9,然后使用算法2.5删除了第3个元素,并打印了删除后的顺序表。

/******
author:  1900
language: C
******/
#include<stdio.h>
#include<malloc.h>#define List_Init_Size 100 //初始大小
#define List_Increase  10  //增量typedef struct{int *elem;    //存储空间基址int lenth;    //当前线性表里面存放数据的长度int listsize; //线性表的容量
}SqList;int InitList_Sq(SqList *L){L->elem=(int *)malloc(List_Init_Size*sizeof(int));if(!L->elem){return -1;//申请失败}L->lenth=0;L->listsize=List_Init_Size;return 1;
}
//在顺序表L种删除第i个元素 并且用e返回其值
int ListDelete_Sq(SqList *L,int i,int *e){if((i<1)||(i>L->lenth)) return -1;   //i要合法int *p=&(L->elem[i-1]); //指针p指向被删除元素地址*e=*p;int *q=&(L->elem[L->lenth-1]);//指针q指向被最后一个元素for(++p;p<=q;++p){*(p-1)=*p;//前移元素}--L->lenth;//表长减一
}
int main(){SqList L;      //声明一个顺序表InitList_Sq(&L);//初始化//将这个顺序表前十个空间,赋值为0-9,for(int i=0;i<10;i++){L.elem[i]=i;printf("%d ",L.elem[i]);L.lenth++;}printf("\n");int e=0;ListDelete_Sq(&L,3,&e);printf("被删除的元素值为:%d\n",e);printf("删除后的顺序表\n");for(int i=0;i<9;i++){printf("%d ",L.elem[i]);}
}

算法2.6 顺序表中查找元素 P26

这个算法,你可能觉得我写的根书上的不一样。其实,书上是用了一个函数指针,书上的算法的作用是,在线性表中查找符合条件的元素,我写的是查找值等于e的元素,所以书上的查找更广义一些,他可以查等于,也可以查大于,等等。条件就写在compare函数里,使用函数指针来传入函数。其他的原理都一样,掌握关键点就好。

//查找元素在线性表中的位序
int LocateElem_Sq(SqList *L,int e){int i=1;int *p=&(L->elem[0]);while(i<=L->lenth&&(*p!=e)){p++;i++;}if(i<L->lenth) return i; //返回位序else return 0;//没找到
}

算法2.7 顺序表的合并 P26

这个算法,注意不是简单的合并就行了,而是按照规则来合并,有点像归并排序的意思,但是比排序简单。
规则就是:给你两个非递减的顺序表,(所谓非递减,其实就是不严格的递增,就是带等于号的递增),要求你将其合并为一个顺序表,合并后的顺序表,仍然是非递减的。
我下面写的这个例子是:La顺序表:2 3 3 5 6 Lb顺序表:2 2 3 4 4 合并之后:合并后的Lc:2 2 2 3 3 3 4 4 5 6

/******
author:  1900
language: C
******/
#include<stdio.h>
#include<malloc.h>#define List_Init_Size 100 //初始大小
#define List_Increase  10  //增量typedef struct{int *elem;    //存储空间基址int lenth;    //当前线性表里面存放数据的长度int listsize; //线性表的容量
}SqList;int InitList_Sq(SqList *L){L->elem=(int *)malloc(List_Init_Size*sizeof(int));if(!L->elem){return -1;//申请失败}L->lenth=0;L->listsize=List_Init_Size;return 1;
}
int MergeList_Sq(SqList *La,SqList *Lb,SqList *Lc){int *pa=&(La->elem[0]);  //指向头的指针int *pb=&(Lb->elem[0]);Lc->listsize=Lc->lenth=La->lenth+Lb->lenth;//初始化Lcint *pc=Lc->elem=(int *)malloc(Lc->listsize*sizeof(int));//给Lc分配空间if(*pc==NULL) return -1;//分配失败int *pa_last=&(La->elem[La->lenth-1]);  //指向尾的指针int *pb_last=&(Lb->elem[Lb->lenth-1]);while(pa<=pa_last &&pb<=pb_last){  //归并if(*pa<=*pb){*pc=*pa;pc++;pa++;}else{*pc=*pb;pc++;pb++;}}while(pa<=pa_last){   //插入La中剩余的*pc=*pa;pc++;pa++;}while(pb<=pb_last){   //插入Lb中剩余的*pc=*pb;pc++;pb++;}return 0;
}
int main(){SqList La,Lb,Lc;      //声明三个顺序表InitList_Sq(&La);//初始化InitList_Sq(&Lb);//La:2 3 3 5 6//Lb:2 2 3 4 4La.elem[0]=2;La.elem[1]=3;La.elem[2]=3;La.elem[3]=5;La.elem[4]=6;La.lenth=5;Lb.elem[0]=2;Lb.elem[1]=2;Lb.elem[2]=3;Lb.elem[3]=4;Lb.elem[4]=4;Lb.lenth=5;MergeList_Sq(&La,&Lb,&Lc);for(int i=0;i<10;i++)printf("%d ",Lc.elem[i]);
}

【数据结构】--章节2.2----线性表的顺序表示和实现相关推荐

  1. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

  2. Java数据结构与算法_线性表_顺序表与链表

    文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...

  3. 数据结构(2) -- 线性表的顺序表示

    2.2 线性表的顺序表示 顺序表基本操作: 插入操作:最坏情况O(n),最好情况O(1),平均情况O(n) 删除操作:最坏情况O(n),最好情况O(1),平均情况O(n) 按值查找:最坏情况O(n), ...

  4. 自学python顺序-python数据结构学习之实现线性表的顺序

    本文实例为大家分享了python实现线性表顺序的具体代码,供大家参考,具体内容如下 线性表 1.抽象数据类型表示(ADT) 类型名称:线性表 数据对象集:线性表是n(>=0)个元素构成的有序序列 ...

  5. 数据结构 | C语言实现线性表的顺序和链式结构

    线性表的顺序表示 线性表的顺序表示,是通过构造一个结构体实现的.结构体内包含一个定长数组和一个顺序表的长度.一维数组可以是静态分配或者是动态分配的.这里使用的是静态分配的方法. 代码如下: #incl ...

  6. 线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法

    线性表基本概念 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串 线性表在逻辑上是线性结构 ...

  7. 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化

    学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...

  8. 数据结构-线性表的顺序结构

    1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...

  9. 数据结构源码笔记(C语言):线性表的顺序表示

    /* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  10. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

最新文章

  1. 洛谷.4234.最小差值生成树(LCT)
  2. 高斯拟合原理_看得见的高斯过程:这是一份直观的入门解读
  3. CPU寻址过程方框图
  4. hdu 1460 完数
  5. eclipse python插件_pydev插件下载-eclipse中的python插件下载6.0.0 官网最新版-西西软件下载...
  6. 有没有人告诉你联合贷款的这些细则
  7. 转载:TD之父李世鹤:TD即将安乐死
  8. Cadence orcad 导出网表(.asc文件)
  9. 【剑指offer】BN层详解
  10. 学会JavaScript函数式编程(第3部分)
  11. java语音输入_求教:javaWeb,添加语音输入的功能实现方法
  12. GitHub Action入门简介
  13. shell--扩展正则表达式之egrep
  14. 网件 R6400 TTL 救砖详细 教程
  15. sr550服务器服务器系统安装,sr550服务器阵列配置
  16. C语言程序设计教材九斗验证,C语言程序设计
  17. 多元统计分析最短距离法_(完整word版)多元统计分析模拟试题
  18. 阿里千万级并发课程开课了,达不到25.6万年薪全额退款
  19. 如何巧妙的应对突如其来的电话面试呢
  20. 计算机word打不原因什么意思,word打不开什么原因

热门文章

  1. C语言 · 阶乘计算 · 基础练习
  2. PHP问题 —— failed to open stream: HTTP request faile
  3. [Linux] sed编辑器
  4. QuickFlowDesigner教程(4)如何用代码控制活动操作人
  5. Spring注解——同一接口有多个实现类,如何注入
  6. sql 练习网站答案解析
  7. java 静态方法调用的问题
  8. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
  9. 谷歌被曝出滥用苹果后门收集用户数据
  10. docker容器跨宿主机通信