c语言进阶8-数据结构
一、 数据结构的起源:
- 1. 为什么要学习数据结构
阿基米德说过:“给我一个支点,我就能翘起地球”。那么给我一个程序,我就能用好程序,给我一个结构,我就能把内容填充完成。打个比方,一个excel表,如果已经有了结构只是填数据,就很简单了,谁都可以去填数据.那么你是要做建结构的那个人还是去填数据的那个人呢?不言而语,我们要做的是那个建结构的人。那么怎么给程序搭建好数据的结构?那么就来学习数据结构吧!
所以数据结构的意义通过在前人大量实践总结得出的一系列解决问题的公用基本元素,学习数据结构,对数学建模会有很大的好处,对程序设计也会有很大的好处。
- 2. 什么是数据结构
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:
Data_Structure=(D,R)
其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合
二、 基本概念和术语
我们知道了什么 数据结构!那么数据结构中数据是什么样的数据,还有其它我们要知道的基本概念有哪些,以及一些专用术语有哪些,我们先来看一个表。《学生成绩表》
学号 |
姓名 |
职位 |
性别 |
数学 |
英语 |
语文 |
总成绩 |
1 |
刘琳 |
班委 |
女 |
50 |
61 |
56 |
167 |
2 |
张华 |
班委 |
男 |
60 |
60 |
54 |
174 |
3 |
张三 |
学生 |
男 |
66 |
62 |
52 |
180 |
4 |
陈露 |
班委 |
男 |
93 |
54 |
62 |
209 |
5 |
李明 |
班委 |
女 |
56 |
45 |
88 |
189 |
6 |
李讲 |
班委 |
女 |
99 |
56 |
65 |
220 |
- 1. 数据
数据:是能被计算机识别,并输入给计算机处理的符号集合。
数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。
- 2. 数据元素
数据元素:是数据的的基本单位,也被称为记录。
- 3. 数据项
数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
比如学生这样的数据元素,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要根据你做的系统来决定。
- 4. 数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。
什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,还是刚才的例子,人都有姓名、生日、性别等相同的数据项。既然数据对象是数据的子集,在实际应用中,处理的数据元素通常具有相同性质,在不产生混淆的情况下,我们都将数据对象简称为数据。好了,有了这些概念的铺垫,我们的主角登场了。说了数据的定义,那么数据结构中的结构又是什么呢?
- 5. 数据结构
我们已经知道了数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
在计算机中,数据元素并不是孤立、杂乱无序的,而是具有内在联系的数据集合。数据元素之间存在的一种或多种特定关系,也就是数据的组织形式。为编写出一个“好”的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。定义中提到了一种或多种特定关系,具体是什么样的关系,这正是我们下面要讨论的问题。逻辑结构与物理结构
(1) 逻辑结构
逻辑结构:是数据元素之间的相互关系。其实这也是我们今后最需要关注的问题。逻辑结构分为以下四种:
① 集合结构
集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似于数学中的集合(如图1-5-1所示)。
图1-5-1.
② 线性结构
线性结构:线性结构中的数据元素之间是一对一的关系(如下图1-5-2所示)。
③ 树形结构
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系(如图1-5-3所示)。
④ 图形结构
图形结构:图形结构的数据元素是多对多的关系(如图1-3-4所示)
我们在用示意图表示数据的逻辑结构时,要注意两点:
- 将每一个数据元素看做一个结点,用圆圈表示。
- 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。从之前的例子也可以看出,逻辑结构是针对具体问题的,是为了解决某个问题,在对问题理解的基础上,选择一个合适的数据结构表示数据元素之间的逻辑关系。
(2) 物理结构
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。数据的存储结构应正确反映数据元素之间的逻辑关系,这才是最为关键的,如何存储数据元素之间的逻辑关系,是实现物理结构的重点和难点。
数据元素的存储结构形式有两种:顺序存储和链式存储。
① 顺序存储结构
顺序存储结构:在逻辑上相邻的元素在物理上也相邻。(如图1-5-5所示)。
② 链式存储结构
链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
数据元素的存储关系并不能反映其逻辑关系,因此需要用一个 指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置(如图1-5-6所示)。
显然,链式存储就灵活多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了。逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
三、 抽象数据类型
- 1. 数据类型
数据类型:是指一组性质相同类型的值的集合及定义在集合上的操作的总称。
在C语言中,按取值的不同,数据类型可分为两类:
(1) 原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。
(2) 结构类型:由若干个类型组合而成,是可以再分解的。例如整型数组是由若干个整数组成的。
- 2. 抽象数据类型
抽象数据类型:是一个数据模型,以及定义在该模型上一组操作。
为了便于在之后的讲解中对抽象数据类型进行规范的描述,我们给出了描述象数据类型的标准格式:
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
......
操作n
......
endADT
颜色函数代码
/* Note:Your choice is C IDE */ #include "stdio.h" #include "stdlib.h" #include "time.h" #include "conio.h" #include "windows.h" int color(int c); void main() { int i,j; int k,l; color(14); printf("贪吃蛇大作战\n"); color(15); printf("贪吃蛇大作战\n"); for(i=6;i<=12;i++){ for(j=7;j<=8;j++){ color(12); printf("-"); printf("|"); if(i==6||i==12){ color(13); for(l=0;l<=25;l++){ printf("-"); }} printf("\n"); } } } int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); return 0; }
北京庙会系统
#include "stdio.h" #include "stdlib.h" int j; void Show_menu(){ printf("\n\n\t\t\t═ 北京庙会 ═\n"); printf("\t\t\t1.门票购买\n"); printf("\t\t\t2.票务查询\n"); printf("\t\t\t3.游园调查\n"); printf("\t\t\t4.刷新\n"); printf("\t\t\t0.退出\n"); printf("请输入功能编号:"); scanf("%d",&j); } void Gnen1(){ int p,d;//p为case1中的张数d为票的单价 float sum=0.0; printf("请输入购票张数:"); scanf("%d",&p); printf("请输入每张票务单价:"); scanf("%d",&d); sum=p*d; printf("请核对信息:购票张数%d,单张票价%.2f,合计总票价%.2f\n",p,(float)d,sum); } void Gnen2(){ int am=0,u;//am为总和 printf("请输入5-10号出票情况\n"); for(j=0;j<6;j++){ printf("请输入%d日的出票情况:",j+5); scanf("%d",&u); am+=u; }//for over printf("5-10日的累计出票%d张\n",am); } void Gnen3(){ int t[8];//t代表年龄 float b1=0.0,b2=0.0,b3=0.0; for(j=0;j<8;j++){ printf("请输入游客年龄:"); scanf("%d",&t[j]); } for(j=0;j<8;j++){ if(t[j]>=20&&t[j]<=60){ b1++; }else if(t[j]>60){ b2++; } }//for 结束 printf("20-60之间的游客占%.2f%%,60岁以上的占%.2f%%,其他年龄分布占%.2f%%\n",(b1*100/8),(b2*100/8),(8-b1-b2)*100/8); } void input_error(){ printf("请输入正确编号!!\n"); } void main() { int mima; int i=1;//j为功能编号 do{ printf("\t\t\t请输入登录密码:"); scanf("%d",&mima); if(mima==123456){ for(i=7;i>0;i++){ Show_menu(); switch (j){ case 1:Gnen1();break; case 2:Gnen2();break; case 3:Gnen3();break; case 4:system("cls");break; case 0:exit(1); default :input_error(); } }//for loop }//if else{ printf("您输入的密码有误,请重新输入,您还有%d次机会\n\n",3-i);} i++; }while(i<=3); }//zuihou
字母排序
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h" void main() { int i,j,k; char ch[5][11]; char tem; for(i=1;i<6;i++){ gets(ch[i]); } for(i=1;i<5;i++){ for(j=0;j<k-i;j++){ if(strcmp(ch[j],ch[j+1])>=0){ strcpy(tem,ch[j]); strcpy(ch[j],ch[j+1]); strcpy(ch[j+1],tem); } } } for(j=1;j<6;j++){ puts(ch[j]);} }