作者:杨木发
版权声明:
本文为博主原创文章,转载请附上源文链接!
本文链接:https://my.oschina.net/yangmufa/blog/write/3094983
导论
1、什么是算法:
:所谓算法在现实生活中就是为解决某个问题而采取的一系列方法和步骤(就好比去超市购物得出步骤为:1、进入超市,2,、挑选商品,3,、付钱走人。),
:在计算机科学领域的算法则是 根据所处理的问题,在数据的逻辑结构和物理结构基础之上,在有限的步骤内解决这个问题 所采用的一组指令序列,
算法的描述方法通常有自然语言、流程图、伪代码、程序设计语言等,且一个应该具有 有穷性、确切性、可行性、输入和输出等特性,一个优秀的程序算法一般情况下通常是用时间复杂度和空间复杂度来衡量的。
2、什么是数据:
其实数据理解起来没有那么复杂在计算机领域,它数据通常是用来描述客观事物的符号表示,是指所有能输入到计算机中并能被计算机识别和处理的符号总称,总而言之就是把现实生活中的一些看见的看不见的听得见的听不见的或不存在的想象出来的一些东西经过抽象出来用一些计算机能更够识别的符号代替表示(比如+-*、和一个利用数值分析方法解决代数方程的程序其实处理的对象是整数和实数),从而就形成了了数据,而像图像、声音、等一下较为复杂的数据则是通过编码后最终归之于数据的范畴。而从组织结构上来说数据又可划分为 数据对象,数据元素,数据项等。从数据类型上来划分又可分类为 数值型(int、float、double)字符型(char、String) 和 抽象数据类型(abstract)等。
3、什么是数据结构:
数据结构有逻辑结构和存储结构之分。
逻辑结构:数据的逻辑结构即数据元素之间的相互关系的描述,根据数据元素之间的关系特性的不同可分为 集合结构、线性结构、树形结构、图形结构等。
集合结构:即元素与元素之间除了同属于一个集合外没有其他任何关系,比如宇宙里面的星球之间除了同属于一个宇宙外没有其他关系。
线性结构:即元素们之间存在着一对一的关系,比如吃饭排队 他们之间除了第一个人和最后一个人每个人都有且仅有一个前者(前驱)和后者(后继)。
树形结构:即元素之间存在一对多的关系,比如学校的组织结构、家族关系等。在数形结构中最上面的节点成为根节点,每个节点最多只能有一个父节点,而父节点可以有多个子节点(叶子节点)由此可知树的主干和树枝是一对多的,注意:此书树形结构中的树和现实中的树类似却又有所不同,在计算机领域中的树形结构里最上面的的为根节点,最下面的为子节点。
图形结构:即元素与元素之间存在多对多的关系,比如每个老师可以教很多学生而每个学生又很很多老师,每个节点都可以同时有多个前驱和后继以及其他联系。
物理结构:数据存储结构(又称 存储结构或物理结构) 是指数据的存储方式或表示 或 数据元素之间的逻辑结构在计算机中的的实现,按照不同的存储结构分别是 顺序结构 和 连式结构 。
顺序结构:顺序结构是指逻辑上相邻的元素其节点的物理结构(内存中的位置)也相邻,节点的逻辑关系可以被存储单元以同样的邻接体现出来。物理结构和逻辑结构一致。比如把0~9的数字模型按照从小到大的顺序放进条形的盒子里,他们存放的顺序位置和逻辑关系上的体现必须是一致的。
链式结构 :是指节点的逻辑关系是由指针来指向的,其逻辑上相邻的元素在物理存储位置上不一定相邻。比如某些同一生源地在外的上班人群他们逻辑上都是同一个地方上的人(身份证地址以及出生地),但是他们当前所在地却编不大江南北各所不同,但是这都没关系,即使身现所在地不同(物理结构),但是身份证和出生地(逻辑结构)是一样的他们就依然是老乡。
小总结:
逻辑结构:是属于元素与元素之间的整体逻辑关系。属于用户视图,是面向问题本身的,反应的是数据的内部构成方式。
物理机构:是数据以及和逻辑结构在计算机中的表示,他们在逻辑上相邻的元素在存储结构中不一定非得相邻,除了存储数据元素之外,其必须能够隐式或显式的表示元素之间的逻辑关系。数据的存储结构是属于具体实现的视图是面向计算机的(而非像逻辑结构哪样是面向人群用户的)。
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);
}
结果:
其实我也纳闷如此浩大的工程结果就这么几个字儿 哈哈,
/*---------------------
(不断学习 坚持创作 善于总结 共同进步)
如果觉得本文对你有所收获,你的请评论点赞
与合理优质的转发也将是鼓励支持我继续创作的动力,
也欢迎访问个人网站(或百度 杨木发个人博客):www.yangmufa.com。
---------------------*/