Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105380
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-02-20 00:23:31

数据结构,一个看到就知道什么意思的名字。不就是说数据那点事嘛。不过里面还是有乾坤的。程序处理的是什么?是数据。数据不清楚怎么处理。

先前学过了数组,字符串数组之类的,用与储存数据的东西。那时我也说了,它很呆板。一个数组只能储存一种类型的数据。现在好了,数据结构可以解决这个问题。

数据结构就是将一些不同类型的,不同元素的数据放在一起,放在一个名字下,类似与打包。这个包的名字就是就是这个数据结构的名称,以后要用到里面的数据,就要它出来引荐了。说的不好听的,就好像大家各玩各的,成不了气候,不如组建个公司,一起打天下。

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  ,这样就获得了第一个成员。依此类推。
举个例子
  1. //example about structures
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. using namespace std;

  6. struct movies_t { //声明了一个数据结构
  7.    string title;
  8.    int year;
  9. } mine, yours;

  10. void printmoive (movies_t movie); //声明了一个函数

  11. int main () {

  12.   string mystr;

  13.   mine.title = "2012";
  14.   mine.year = 2010;
  15.   
  16.   cout<<"enter your title: "; //两个不同的方法获取数据
  17.   getline (cin, yours.title);
  18.   cout<<"enter year: ";
  19.   getline (cin, mystr);
  20.   sstream(mystr)>>yours.year;
  21.   
  22.   cout <<"My favorite movie is: \n";
  23.   printmovie (mine);
  24.   cout<<"And yours is: \n";
  25.   printmovie (yours);
  26.    
  27.   return 0;

  28. }

  29. void printmovie (movie_t movie) { //定义函数
  30.   
  31.    cout<<movie.title;
  32.    cout<<"("<<movie.year<<")\n";
  33. }


其实可以将数据结构做成一个数据,即由数据结构组成的数组。这个有意思吧。在上面的例子上改动一下。
  1. //example about structures
  2.     #include <iostream>
  3.     #include <string>
  4.     #include <sstream>
  5.     using namespace std;

  6.     struct movies_t { //声明了一个数据结构
  7.        string title;
  8.        int year;
  9.     } films [N_MOVIES]; //这可是一个数组,一个数据结构的数组。

  10.     void printmoive (movies_t movie); //声明了一个函数

  11.     int main () {
  12.       string mystr;
  13.       
  14.       for (int n=0;n<N_MOVIES;++n) {
  15.       cout<<"enter title: "; //两个不同的方法获取数据
  16.       getline (cin, films[n].title);
  17.       cout<<"enter year: ";
  18.       getline (cin, mystr);
  19.       sstream(mystr)>>films[n].year;
  20.        }
  21.       
  22.       cout << "\n You have entered these movies: \n";

  23.      for (int n=0;n<N_MOVIES;++n) {
  24.            printmovie (films[n]);
  25.        }
  26.        
  27.       return 0;
  28.     }
  29.     void printmovie (movie_t movie) { //定义函数
  30.       
  31.        cout<<movie.title;
  32.        cout<<"("<<movie.year<<")\n";
  33.     }

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) |
给主人留下些什么吧!~~