数据结构,一个看到就知道什么意思的名字。不就是说数据那点事嘛。不过里面还是有乾坤的。程序处理的是什么?是数据。数据不清楚怎么处理。
先前学过了数组,字符串数组之类的,用与储存数据的东西。那时我也说了,它很呆板。一个数组只能储存一种类型的数据。现在好了,数据结构可以解决这个问题。
数据结构就是将一些不同类型的,不同元素的数据放在一起,放在一个名字下,类似与打包。这个包的名字就是就是这个数据结构的名称,以后要用到里面的数据,就要它出来引荐了。说的不好听的,就好像大家各玩各的,成不了气候,不如组建个公司,一起打天下。
1. 数据结构声明
声明用到一个关键字:struct
格式
struct struct_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.......
};
struct_name object_name;
struct_name可以认为是这结构的结构类型。object_name就是这个数据结构类型的一个有效对象名。
如果想得到数据结构里面的成员,很简单:object_name.member_name1 ,这样就获得了第一个成员。依此类推。
举个例子
- //example about structures
-
#include <iostream>
-
#include <string>
-
#include <sstream>
-
using namespace std;
-
-
struct movies_t { //声明了一个数据结构
-
string title;
-
int year;
-
} mine, yours;
-
-
void printmoive (movies_t movie); //声明了一个函数
-
-
int main () {
-
-
string mystr;
-
-
mine.title = "2012";
-
mine.year = 2010;
-
-
cout<<"enter your title: "; //两个不同的方法获取数据
-
getline (cin, yours.title);
-
cout<<"enter year: ";
-
getline (cin, mystr);
-
sstream(mystr)>>yours.year;
-
-
cout <<"My favorite movie is: \n";
-
printmovie (mine);
-
cout<<"And yours is: \n";
-
printmovie (yours);
-
-
return 0;
-
-
}
-
-
void printmovie (movie_t movie) { //定义函数
-
-
cout<<movie.title;
-
cout<<"("<<movie.year<<")\n";
-
}
其实可以将数据结构做成一个数据,即由数据结构组成的数组。这个有意思吧。在上面的例子上改动一下。
- //example about structures
-
#include <iostream>
-
#include <string>
-
#include <sstream>
-
using namespace std;
-
-
struct movies_t { //声明了一个数据结构
-
string title;
-
int year;
-
} films [N_MOVIES]; //这可是一个数组,一个数据结构的数组。
-
-
void printmoive (movies_t movie); //声明了一个函数
-
-
int main () {
-
string mystr;
-
-
for (int n=0;n<N_MOVIES;++n) {
-
cout<<"enter title: "; //两个不同的方法获取数据
-
getline (cin, films[n].title);
-
cout<<"enter year: ";
-
getline (cin, mystr);
-
sstream(mystr)>>films[n].year;
-
}
-
-
cout << "\n You have entered these movies: \n";
-
-
for (int n=0;n<N_MOVIES;++n) {
-
printmovie (films[n]);
-
}
-
-
return 0;
-
}
-
void printmovie (movie_t movie) { //定义函数
-
-
cout<<movie.title;
-
cout<<"("<<movie.year<<")\n";
-
}
2. 指向结构的指针
自从指针出来后,那都有它的身影。没办法,人家就是灵活多变。话虽这么说,用指针也要条件的了。结构可以认为是自定义的数据类型。好,既然是类型,那就可以用指针嘛:这个类型的指针。
做个数据结构不多说了,例如上面的结构。那做个指针呢
movie_t * pmovie;
看到没有,就把movie_t当成int啊,或者其他类型来看,来用就对了。
提示一下,你如果用了指针,那么获取这个结构里的数据的方法就不一样了,不在是".",而是"->"。
例如
pmovie->title;
3. 嵌套结构
就是结构套着结构。你如何把结构名当成正常的类型来看,就很容易理解了。
struct friends_t {
string name;
string email;
movies_t favorite_movie; //这里就嵌套了
} charlie, maria;
friends_t * pfriends = &maria;
你看不就行了。
获取数据也简单
charlie.favorite_movie.title; //正常情况
pfriends->favorite_movie.year; //指针情况
4. 定义数据类型(typedef)
用typedef可以将一些数据类型定义为其他的,或者说别名吧。所以只能定义已经存在的类型。
typedef int C; //以后C就是int类型了。你可以用C定义变量的类型。
5. 联合(unions)
类似结构,不过它的成员都在内存中同一个地方。大小呢是它声明的成员中最大的那个。也就是说,成员里,谁的大,就做为联合的大小。
6. 匿名联合(anonymous unions)
就是没有名字。可以直接访问它的成员。
struct {
char title [50];
char author [50];
union { //结构里的联合
float dollars;
int year;
}; //没有对象名
} book;
要访问联合里的数据,很简单。
book.dollars;
7. 枚举(enum)
枚举可以弄一个新的数据类型,它不是基于现有的数据类型基础上的。
enum color_t {black,red,blue,green,cyan,purple };
数据结构就这样,细将就太多了。
阅读(1316) | 评论(0) | 转发(0) |