数据结构与算法C语言版 导论、抽象数据类型、顺序结构表的建立以及初始化测试...

作者:杨木发
版权声明:
       本文为博主原创文章,转载请附上源文链接!

本文链接:https://my.oschina.net/yangmufa/blog/write/3094983

导论

1、什么是算法:

    :所谓算法在现实生活中就是为解决某个问题而采取的一系列方法和步骤(就好比去超市购物得出步骤为:1、进入超市,2,、挑选商品,3,、付钱走人。),

    :在计算机科学领域的算法则是 根据所处理的问题,在数据的逻辑结构和物理结构基础之上,在有限的步骤内解决这个问题 所采用的一组指令序列,

算法的描述方法通常有自然语言、流程图、伪代码、程序设计语言等,且一个应该具有 有穷性、确切性、可行性、输入和输出等特性,一个优秀的程序算法一般情况下通常是用时间复杂度和空间复杂度来衡量的。

2、什么是数据:

其实数据理解起来没有那么复杂在计算机领域,它数据通常是用来描述客观事物的符号表示,是指所有能输入到计算机中并能被计算机识别和处理的符号总称,总而言之就是把现实生活中的一些看见的看不见的听得见的听不见的或不存在的想象出来的一些东西经过抽象出来用一些计算机能更够识别的符号代替表示(比如+-*、和一个利用数值分析方法解决代数方程的程序其实处理的对象是整数和实数),从而就形成了了数据,而像图像、声音、等一下较为复杂的数据则是通过编码后最终归之于数据的范畴。而从组织结构上来说数据可划分为 数据对象,数据元素,数据项等从数据类型上来划分又可分类为  数值型(int、float、double)字符型(char、String) 和 抽象数据类型(abstract)等。

3、什么是数据结构:

数据结构有逻辑结构和存储结构之分。

    逻辑结构:数据的逻辑结构即数据元素之间的相互关系的描述,根据数据元素之间的关系特性的不同可分为 集合结构、线性结构、树形结构、图形结构等。

            集合结构:即元素与元素之间除了同属于一个集合外没有其他任何关系,比如宇宙里面的星球之间除了同属于一个宇宙外没有其他关系。

            线性结构:即元素们之间存在着一对一的关系,比如吃饭排队 他们之间除了第一个人和最后一个人每个人都有且仅有一个前者(前驱)和后者(后继)。

            树形结构:即元素之间存在一对多的关系,比如学校的组织结构、家族关系等。在数形结构中最上面的节点成为根节点,每个节点最多只能有一个父节点,而父节点可以有多个子节点(叶子节点)由此可知树的主干和树枝是一对多的,注意:此书树形结构中的树和现实中的树类似却又有所不同,在计算机领域中的树形结构里最上面的的为根节点,最下面的为子节点。

            图形结构:即元素与元素之间存在多对多的关系,比如每个老师可以教很多学生而每个学生又很很多老师,每个节点都可以同时有多个前驱和后继以及其他联系。

    物理结构:数据存储结构(又称 存储结构或物理结构) 是指数据的存储方式或表示 或 数据元素之间的逻辑结构在计算机中的的实现,按照不同的存储结构分别是 顺序结构 连式结构

            顺序结构:顺序结构是指逻辑上相邻的元素其节点的物理结构(内存中的位置)也相邻,节点的逻辑关系可以被存储单元以同样的邻接体现出来。物理结构和逻辑结构一致。比如把0~9的数字模型按照从小到大的顺序放进条形的盒子里,他们存放的顺序位置和逻辑关系上的体现必须是一致的。

            链式结构 :是指节点的逻辑关系是由指针来指向的,其逻辑上相邻的元素在物理存储位置上不一定相邻。比如某些同一生源地在外的上班人群他们逻辑上都是同一个地方上的人(身份证地址以及出生地),但是他们当前所在地却编不大江南北各所不同,但是这都没关系,即使身现所在地不同(物理结构),但是身份证和出生地(逻辑结构)是一样的他们就依然是老乡。

小总结:

逻辑结构:是属于元素与元素之间的整体逻辑关系。属于用户视图,是面向问题本身的,反应的是数据的内部构成方式。

物理机构:是数据以及和逻辑结构在计算机中的表示,他们在逻辑上相邻的元素在存储结构中不一定非得相邻,除了存储数据元素之外,其必须能够隐式或显式的表示元素之间的逻辑关系。数据的存储结构是属于具体实现的视图是面向计算机的(而非像逻辑结构哪样是面向人群用户的)。

60917ed656eb4032a07a5c34a108018d74a.jpg

4、抽象数据类型的定义和顺序表结构的建立:

注:为了源文件的方便管理和逻辑清晰把抽象数据类型和顺序表全部定义在 DataElement.h 头文件里代码如下:

手机终端 显示不全 可在代码区 左右 滑动屏幕

#include <stdio.h>
#include <stdlib.h>

#define size_MAX 255

//1、定义数据元素
//typedef int Element;//自定义数据类型是在已有的基本数据类型基础上的搭配集合,也可理解为抽象抽象抽象类型
typedef struct {
    int id;
    char *name;
}ElementType1;

//2、定义顺序表结构
typedef struct {
    ElementType1 datas[size_MAX];//数据元素的集合.
    int length;//顺序表的当前占用长度
}SequenceList1;

5、初始化顺序表、插入元素、打印输出:

注:为了源文件的方便管理和逻辑清晰把初始化顺序表、插入元素、打印输出等函数实现操作全部封装在 SequenceList.h 有文件里代码如下:

手机终端 显示不全 可在代码区 左右 滑动屏幕

#include <stdio.h>
#include <stdlib.h>
#include "DataElement.h"
void InitList(SequenceList1 * sequenceList,ElementType1 *dataelement,int length );
void InsertElement(SequenceList1 *sequenceList,ElementType1 *element,int index);
void PrintList(SequenceList1 *sequenceList);

/**
*初始化顺序表
*@sequenceList:要初始化的顺序表
*@elementArray:初始化元素内容数组
*@length:初始化长度
*/
void InitList(SequenceList1 * sequenceList,ElementType1 *lementArray,int length){
    int i=0;
    sequenceList->length=0;
    if(length>size_MAX){
        printf("长度越界,初始化失败!!!\n");
    }
    for(i;i<length-1;i++){
       InsertElement(sequenceList,&lementArray[i],i);
    }
	printf("\n初始化成功!\n\n");
}


/**
*往顺序表中插入元素
*@sequenceList:要插入到此顺序表
*@element:往此顺序表插入的元素
*@index:插入的下标
*/
void InsertElement(SequenceList1 *sequenceList,ElementType1 *element,int index){
    int i=sequenceList->length-1;
    //1、判断下标是否越界
    if(index>SIZE_MAX-1||index<0){
        printf("不在最大或最小范围内,插入元素失败!!!");
       return;
    }
    //2、判断表空间是否已满
    if(sequenceList->length+1>=SIZE_MAX){
        printf("空间已满!插入元素失败!!!");
        return;
    }
    //3、判断index是否在length之内不然
    //if(index>sequenceList->length){}
    //4、把length-1开始后面所有元素往后移动一个位置
    for(i;i>=index;i--){
        sequenceList->datas[i+1]=sequenceList->datas[i];
    }
    //5、讲要插入的值赋给第index元素
    sequenceList->datas[index]=*element;
    //6、顺序表总长度+1;
    sequenceList->length++;
	printf("插入成功!\n");

}


/**输出打印
*
*/
void PrintList(SequenceList1 *sequenceList){
    int i=0;
    for(i=0;i<sequenceList->length;i++){
        printf("%d %s\n",sequenceList->datas[i].id,sequenceList->datas[i].name);
    }
	printf("\n打印完毕!\n\n");
}

6、测试

注:由于在Sequence.h中已经导入DataEmlemnt.h故在主函数中不再需要引入以免造成函数等重定义等错误。

手机终端 显示不全 可在代码区 左右 滑动屏幕

#include <stdio.h>
#include <stdlib.h>
//#include "DataElement.h"
#include "SequenceList.h"


//顺序表初始化测试
void TestSequenceList();

int main()
{
    //printf("Hello world!\n");
	TestSequenceList();
    return 0;
}


void TestSequenceList(){
    SequenceList1 seqList;//=(SequenceList1*)malloc(sizeof(SequenceList1));
    ElementType1 dataArray[]={{1,"奇异博士"},{2,"美国队长"},{3,"太上老君"},{4,"菩提老祖"}};
    InitList(&seqList,dataArray,sizeof(dataArray)/sizeof(dataArray[0]));
    PrintList(&seqList);
}

结果:

fdf20a7172f155d177be89698efe2014fa8.jpg

其实我也纳闷如此浩大的工程结果就这么几个字儿 哈哈,

 

/*---------------------

(不断学习 坚持创作 善于总结 共同进步)

如果觉得本文对你有所收获,你的请评论点赞

与合理优质的转发也将是鼓励支持我继续创作的动力,

 也欢迎访问个人网站(或百度   杨木发个人博客):www.yangmufa.com
---------------------*/

转载于:https://my.oschina.net/yangmufa/blog/3094983

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 本演示程序中,集合元素限定为数字,大小由用户输入。集合中数字顺序不限,且一旦出现重复字符或非法字符,程序能自动滤去。输出的运算结果中将不含重复数字或非法字符,且按照从小到大的顺序输出。<br>2. 演示程序以用户和计算机的对话方式执行,即在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的数据输入和运算结果显示在其后。<br>3. 程序执行的命令包括:<br>(1)构造集合1;(2)构造集合2;(3)判断某数是否为集合元素;(4)添加元素;(5)删除元素;(6)求并集(存入集合1中);(7)求交集(存入集合3中);(8)输出集合1;(9)输出集合2;(0)退出。<br>“构造集合1”和“构造集合2”时,需以整型数字形式键入集合元素。<br><br>为实现上述程序功能,以线性链示集合。为此,需要两个抽象数据类型:线性和集合。<br>1. 线性抽象数据类型定义为:<br> ADT LinkList{<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={< , >| , D, < ,i=2,…,n}<br> 基本操作:<br> InitList(*L)<br> 操作结果:构造一个空的线性链L。<br> IsElement(*L,e)<br> 初始条件:线性L已存在。<br> 操作结果:若e是L的数据元素,返回1,否则返回0。<br> Append(*L,e)<br> 初始条件:线性已存在。<br> 操作结果:按照由大到小的顺序往线性里插入元素e,不允许重复元素。<br> Delete(*L,e)<br> 初始条件:线性已存在。<br> 操作结果:在L中删除元素e。<br> }ADT LinkList<br>2. 集合的抽象数据类型定义为:<br> ADT LinkSet {<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={}<br> 基本操作:<br> CreatSet(*L)<br> 初始条件:s为整型数组。<br> 操作结果:生成一个由s中数字构成的集合。<br> Union(*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的并集构成的集合,返回到S1。<br> Intersection (*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的交集构成的集合,返回到S1。<br> PrintSet (*S)<br> 初始条件:集合S已存在。<br> 操作结果:依次显示集合S中的全部元素。<br> }ADT LinkSet<br><br><br>带菜单<br>Turbo c 3.0编写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值