数据的组织结构(一).

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
元素n元素2元素1lomloi1mlon1mlocili1m每个元素所占用的存储单元大小开始结束定义数据结构处理数据输入数据输出结果定义数据结构时即初始化全部元素intvote10102368912745可以省略intvote102368912745有多少个初始值数组默认大小就是多大
第4讲 数据的组织结构(一)
通用公式
Lo
Lo+m
元素1 元素2 ……..
Lo+(i-1)*m
元素i
……..
Lo+(n-1)*m
元素n
每个元素所占用 的存储单元大小
Loc(i)=Lo+(i-1)*m
开始
选 举 问 题 算 法
定义数据结构
输入数据
处理数据
输出结果
结束
一维数组初始化
定义数据结构时即初始化全部元素 int vote[10]={10,2,3,6,8,9,12,7,4,5}
/* 选择排序 */ for (i=0; i<NUM-1; i++) { minValue = i; for (j=i+1; j<NUM; j++) { /* 选择i~NUM-1之间的最小数值 */ if (data[j]<data[minValue]) minValue = j; } if (minValue!=i) { /* 交换 */ temp = data[i]; data[i] = data[minValue]; data[minValue] = temp; } }
;
// 输出查找结果 if( low<=high ) printf("\n%d is found at %d", key, mid); else printf("\n%d is not found.", key); }
//有序表二分查找 low = 0; high = NUM-1; // 置区间初值 while (low <= high) { mid = (low + high) / 2; if (value[mid]==key ) break; // 找到待查元素 if ( value[mid]<key ) low = mid + 1; // 继续在后半区间进行查找 else high = mid - 1; // 继续在前半区间进行查找 }
char [100];
p r o 0 1 2 g 3 r 4 a m \0 … 5 6 7 … 99
#include <stdio.h> #include <stdlib.h> #include <ctime> #define SIZE 35 /*数组大小*/ void main( ) { int num,flag=0; int score[SIZE]; while( 0 == flag ) { printf("the number:"); scanf("%d",&num); if( num>=0||num<=35 ) flag++; } /* 随机产生35个考试成绩*/ srand((unsigned)time(NULL)); for (i=0; i<num; i++) { score[i] = rand()&100; }
可以省略 int vote[]={10,2,3,6,8,9,12,7,4,5} 有多少个初始值,数组默认大小就是多大。
一维数组初始化
对部分元素赋初值 int vote[10]={10,2,3,6}
不可以省略
只对前4个元素赋了初值。
一维数组元素的引用及基本操作
引用数组元素: <数组变量名>[<下标表达式>],如: vote[0],vote[1],vote[2],… for( i=0; i<n; i++ ) vote[i]++; 下标表达式的值一定要在下标取值范围内
给数组赋值
vote[0]=3;
for( i=0; i<10; i++) { scanf(“%d”, &vote[i]); }
数组输出
for( i=0; i<10; i++) { printf(“%d”, vote[i]); }
学习程序 “ 选举:用数组 ”
二、编程实例
按条件对数据筛选
学习[P81,例4-1]
//产生随机数
}
/*返显35名学生的考试成绩,作为测试*/ …… /*顺序查找是否存在不及格的学生*/ …… /*输出查找结果*/ ……
#define NUM 35 /*学生人数*/ main( ) { int score[NUM]; int i; /* 随机产生35个考试成绩 */ …… /*返显35名学生的考试成绩,作为测试*/ for (i=0; i<NUM; i++) { printf("\nNo.%d: %d", i+1, score[i]); } /*顺序查找是否存在不及格的学生*/ …… /*输出查找结果*/ ……
排序
排序是计算机内经常进行的一种操作,其 目的是将一组“无序”的记录序列调整为 “有序”的记录序列。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
不用另外数组调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97
选择排序
}
#define NUM 35 /*学生人数*/ main( ) { int score[NUM]; int i; /* 随机产生35个考试成绩 */ …… /*返显35名学生的考试成绩,作为测试*/ …… /*顺序查找是否存在不及格的学生*/ …… /*输出查找结果*/ if (i<NUM) printf("\nNot all pass."); else printf("All pass.");
类型定义
<元素数据类型> <数组变量名>[<元素数量>];
分析:
全部数组元素都是所定义的元素数据类型 数组变量命名与通常变量命名方式相同 必须说明元素数量 int vote[10];
int vote[10];
vote 0 1 2 3 4 5 6 7 8 9
每个元素均为整型,记录得票数 存放在10个连续的地址空间。数组占存 储空间的大小:元素数量*每个元素储存 空间大小 数组元素下标从0开始,所以第5个元素 的下标是4,即是:vote[4]
例如: key=20 的查找过程如下:
ST.length
ST.elem
05 13 19 21 37 56 64 75 80 88 92
0 1 2 3 4 5 6 7 8 9 10 11
high mid low
查找不成功的条件:low > high
开始 low=0;high=NUM-1;
low<=high
}
/* 输出排序后list is:\n"); for (i=0; i<NUM; i++) { printf("%5d", data[i]); }
数组大小与元素数目
数组的特点
每个元素数据类型相同,操作相似。 定义数组时必须给出数组大小。 区分数组的大小和数组中元素的个数。 数组大小 元素多少
}
二分查找
[P90,例4-5] 问题:已知一个非递减有序整数数列(05, 13,19,21,37,56,64,75,80,88, 92)。请编写一个程序,查找其中是否存在与 给定key值相等的数。 能否用顺序查找? 尝试另一种效率更高的方法。
P91流程图a P91流程图b
上、下级的流程图。
开始 构造非递减数组value 输入key 二分查找Key Y 存在Key N
N
Y mid=中央位置
value[mid]==key
Y 结束 N high=mid-1
Y low=mid+1
N
value[mid]<key
#include <stdio.h> #define NUM 10 main () { int value[NUM]={05,13,19,21,37,56,64,75,80,88}; int low,high,mid,key; printf("\nEnter a key:"); scanf("%d", &key); // 二分查找
交换
i+1i
#include <stdio.h> #define NUM 10 main() { int data[NUM]; int i, j, minValue, temp;
/* 参与排序的数据个数 */ /* 存放参与排序的所有整数 */
/* 通过键盘输入待排序的整型数列 */ printf("\nEnter %d integers.", NUM); for (i=0; i<NUM; i++) { scanf("%d", &data[i]); } /* 显示原始整型数列 */ printf("\n%d integers are:", NUM); for (i=0; i<NUM; i++) { printf("%5d", data[i]); }
/*显示35名学生的考试成绩*/ for (i=0; i<num; i++) { printf("\nNo.%d: %d", i+1, score[i]); } /*顺序查找是否存在不及格的学生 */ for (i=0; i<num; i++) { if (score[i]<60) break; } /*输出查找结果*/ if (i<num) printf("\nNot all pass."); else printf("All pass."); }
三、字符数组与字符串
字符数组定义 字符串初始化
char str[] = "C program"; char str[] = {"C program"};
char str[] ={'C', ' ','p','r','o','m','g','r','a','m','\0'};
C p r 0 1 2 3
选择排序
假设排序过程中,待排记录序列的状态为: 有序序列R[1..i-1] 第i趟 选择排序 无序序列 R[i..n]
从中选出 关键字最小的记录
有序序列R[1..i]
无序序列 R[i+1..n]
开始
输入待排序整数数列
显示整数数列
0i
i<NUM-1 Y iminValue
N
显示排序后的结果 选择最小值minValue 结束 Y minValue!=i N
}
#define NUM 35 /*学生人数*/ main( ) { int score[NUM]; int i; /* 随机产生35个考试成绩 */ …… /*返显35名学生的考试成绩,作为测试*/ …… /*顺序查找是否存在不及格的学生*/ for (i=0; i<NUM; i++) { if (score[i]<60) break; } /*输出查找结果*/ ……
#define NUM 35 /*学生人数*/ main( ) { int score[NUM]; int i; /* 随机产生35个考试成绩 */ randomize( ); for (i=0; i<NUM; i++) { score[i] = random(100); }
//初始化随机数生成器,tc3
一、一维数组 二、编程实例 三、字符数组与字符串 四、二维数组
一、一维数组
数组的特点
每个数组元素数据类型要相同 每个数组元素上通常的操作要相同
实例1:某部门,需要由全体员工推选一名办 公室主任。假设有10名候选人。编程序统计每 个候选人的得票数量,得票最多当选,给出选 举结果。 10个人的情况一样(得票数、累计) 综合10人情况给出选举结果。
输出成功
输出失败
结束
例如: key=64 的查找过程如下:
ST.length
ST.elem
05 13 19 21 37 56 64 75 80 88 92
0 1 2
low
3 4
5 6
7 8
9 10 11
high
low high mid mid mid
low 指示查找区间的下界 high 指示查找区间的上界 mid = (low+high)/2
o 4
g 5
r 6
a m \0 7 8 9
字符串输入
标准函数 char str[100]; gets(str); 从键盘输入字符串,直到换行符或文件 结束符为止。如:输入:program<回 车>。内存中状态:
按条件对数据统计
[P84,例4-2] 自学 [P86,例4-3]
顺序查找
查找是最常见、最基本的操作. 查找成功:依据查找关键字,只要找到 与关键字相同的记录,即查找成功 查找不成功:所有记录数据中没有与关 键字相同的记录
例:顺序查找
某班级35名学生,检查是否存在不及格的 学生。
#define NUM 35 /*学生人数*/ main( ) { int score[NUM]; int i; /* 随机产生35个考试成绩 */ /*返显35名学生的考试成绩,作为测试*/ /*顺序查找是否存在不及格的学生*/ } /*输出查找结果*/
相关文档
最新文档