目录
数据结构
数据结构指:数据的逻辑结构和存储结构及操作 数据:信息的载体 数值型数据:整型、字符型、浮点型等 非数值型数据:图像、视频、声音等 数据项:数据元素由若干个数据项组成,数据项是数据的最小单位
常用的数据结构
逻辑结构: 1、集合:除了同属一个集合,再无其他关系 2、线性结构: 一个对一个,如线性表、栈、队列。数据元素是一对一的关系,每一个节点之间存在前驱和后继的关系,当然除去第一个(没有前驱)和最后一个(没有后继)。 线性结构按照存储类型可以分为:顺序表、顺序栈、顺序队列;链表、链栈、链队列。 3、树状结构:一个对多个,如树。数据元素之间是一对多的关系,每一个元素都只能有一个前驱,可以有多个后继。前驱也叫父节点,后继也叫子节点。 4、图:多个对多个 存储结构:顺序存储、链式存储、索引存储、散列存储
数据结构的基本运算:增、删、改、查
算法的基本概念:
1、程序:一组有序二进制指令、存储在磁盘、可以执行、静态(不会占用系统资源:cpu 内存等) 2、进程:运行起来的程序 3、算法:是一个有穷规则的有序集合
程序与算法的区分
算法特性: 1、有穷性:算法执行步骤有限 2、确定性:每个计算步骤无二义性 3、可行性:每个计算步骤都可以在有限时间内完成 4、输入: 算法有零个或多个外部输入 5、输出: 算法有一个或多个输出 算法和程序既有联系既有不同 相同:二者都是为了完成某个任务,或解决某个问题而编制而成的有序集合。 区别: 1、算法与计算机无关,程序依赖于具体的计算机语言 2、算法必须是又穷尽的,但程序可以是无穷的 3、算法可以忽略一些语法细节,重点在解决问题的思路上,但程序必须严格遵循语言工具的语法。算法必须转换成程序后才能在计算机上运行。
如何判定算法的好坏
1、消耗空间多少 2、消耗时间多少 3、容易理解、编程、调试、维护
时间复杂度
问题的规模 :输入数据量的大小,用n来表示。 算法消耗时间,它是问题规模的函数 T(n)。 时间复杂度: 1. 根据频度写出语句表达式 2. 常数项化为1 3. 保留最高阶,去除其余项 4. 最高阶如果乘数不为1,化为1
顺序表
顺序表本质上是程序员基于结构体构造的一种新的类型。 结构体中以一个数组作为顺序表身,一个下标标识。 特别的: 在顺序表中,typedef int data_t。用datd_t 代表整型。 下标lsat 值为-1表示,表中无数据,last+1 表示数据长度。 数据表特点:内存空间连续存储
顺序表优缺点
优点:查询和修改快速方便 缺点: 1、需要一片连续的空间 2、增加和删除时涉及大量数据移动、耗时 3、当数据表大小确定后不能再次修改。 不适合数据量的时候使用,对表的插入和删除等运算时间复杂度较差。 1、创建顺序表,last = -1 2、判空 3、判满 4、求长度 5、插入 6、删 7、改 8、清空 9、销毁 #define max 16 typedef int data_t; typedef struct data_t{ data_t data[max]; int last; }seqlist; #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 10 typedef int data_t; typedef struct seq{ //构造顺序表类型 data_t data[SIZE]; int last; }seqlist; seqlist* creat_list(); int seqlist_is_empty(seqlist*); int seqlist_is_full(seqlist*); int seqlist_len(seqlist*); int seqlist_initialise(seqlist*,int); int seqlist_outpit(seqlist*); int seqlist_add(seqlist* , int , int); int seqlist_del(seqlist* , int ); data_t find_by_post(seqlist* , int ); data_t * find_by_data(seqlist* , data_t ); int main() { int post,val,i,j; int data =0 ; seqlist* head = creat_list(); //调用函数创建顺序表。 if(NULL == head) { printf("申请空间失败。\n"); exit(-1); }else{ printf("申请空间成功。\n"); } puts("输入赋值节点post <=9 :"); scanf("%d",&post); int ret = seqlist_initialise(head,post); //给顺序表赋值 if(0 == ret ) { printf("赋值成功。\n"); }else { printf("赋值失败。ret = %d\n",ret); exit(-1); } seqlist_outpit(head);//打印 printf("需要插入节点个数:\n"); scanf("%d",&i); while(i--) { printf("输入节点 pos < 9,以及插入数据。用空格隔开。\n"); scanf("%d%d",&post,&val); ret = seqlist_add( head, post, val);//插入节点 if(-1 == ret || -2 == ret || -3 == ret ) { printf("程序出错,退出。ret = %d\n",ret); exit(-1); } seqlist_outpit(head);//打印 } printf("输入需要删除的节点 post\n"); scanf("%d",&post); seqlist_del(head, post);//删除节点 seqlist_outpit(head); puts("输入需要查找的数值,data"); scanf("%d",&data); data_t* postl = find_by_data(head,data); int len_post =postl[0]; for( i = 1 ; i <= len_post ; i++) { printf("data = %d post = %d \n",data,postl[i]); } return 0; } seqlist* creat_list() { seqlist* head = (seqlist*)malloc(sizeof(seqlist)); if(NULL == head) return NULL; memset(head->data,0,SIZE); head->last = -1; return head; } //判空 int seqlist_is_empty(seqlist* head) { if(NULL == head) return -1; return ((head->last == -1)?1:0); } //判满 int seqlist_is_full(seqlist* head) { if(NULL == head) return -1; return ((head->last +1 == SIZE)?1:0); } //求表长(实际元素个数) int seqlist_len(seqlist* head) { if(NULL == head) return -1; return head->last +1; } //赋初值 int seqlist_initialise(seqlist* head, int post) { int i = 0; if(post < 0 || post > (SIZE-1)) return -1; for(i = 0; i <= post ; i++) { head->data[i] = i; } head->last = post; return 0; } //打印当前顺序表 int seqlist_outpit(seqlist* head) { if(NULL == head) return -1; int i = 0; for(i = 0; i <= head->last; i++) { printf("data[%d] = %d ",i,head->data[i]); } puts(""); return 0; } //增 int seqlist_add(seqlist* head, int post, int val) { int i = 0 ; if(NULL == head) return -1; if(1 == seqlist_is_full(head) ) { printf("表已经满,无法插入数据。"); return -2; } if(post < 0 || post > head->last+1) return -3; for(i = head->last ; i >= post ; i--) { head->data[i+1] = head->data[i]; } head->data[post] = val; head->last++; return 0; } //删 int seqlist_del(seqlist* head, int post) { int i ; if(NULL == head ) return -1; if(post < 0 || post > head->last) return -2; if( 1 == seqlist_is_empty(head)) { printf("顺序表空,无法删除"); return -3; } for(i = post ; i < head->last ; i++ ) { head->data[i] = head->data[i+1];