数据结构

数据结构

一个 数据结构是一组一个名称组合在一起的数据元素。这些数据元素被称为 成员,可以有不同的类型和不同的长度。:数据结构,可以在C使用下面的语法声明++ 哪里是结构类型的名称,可以是具有这种结构的类型的对象了一套有效的标识符。内牙套,存在与数据成员的列表,每一个与一类和有效的标识符作为其名称指定。 例如:

struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

type_name object_name {}



1
2
3
4
5
6
7
struct product {
  int weight;
  double price;
} ;

product apple;
product banana, melon;
 


声明一个结构类型,叫做 product,并定义有两个成员是: weightprice,每一个不同的基本类型。此声明创建一个新类型( product),然后将其用于声明这种类型的三个对象(变量): , applebananamelon。注意如何一次 product声明,它是用来就像任何其他类型。

就在结束时 struct的定义,以及前结束分号( ;),可选字段 object_names可以用来直接声明结构类型的对象。例如,结构对象 applebanana以及 melon可以在数据结构类型定义的时刻被声明:

1
2
3
4
struct product {
  int weight;
  double price;
} apple, banana, melon;
 


在这种情况下,在 object_names指定的类型名称( product)变为可选的: struct要求要么一个 type_name或至少一个名称中 object_names,但不一定两者。

之间是什么结构类型名(明确区分是重要的 product),并且这是什么类型的对象( applebanana,和 melon)。许多对象(如 applebananamelon)可以从一个单一的结构类型声明( product)。

一旦确定的结构类型的三个对象的声明( applebanana,和 melon)其成员可以直接访问。对于语法很简单插入一个点( .对象名称和成员名称之间)。例如,我们可以使用任何这些元素的操作,如果他们各自的类型的标准变量:

1
2
3
4
5
6
apple.weight
apple.price
banana.weight
banana.price
melon.weight
melon.price
 


这些每一个具有相应于它们指的是部件的数据类型: apple.weightbanana.weight,和 melon.weight的类型的 int,同时 apple.pricebanana.pricemelon.price是类型 double

这里是在动作结构类型的一个真实的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// example about structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
} mine, yours;

void printmovie (movies_t movie);

int main ()
{
  string mystr;

  mine.title = "2001 A Space Odyssey";
  mine.year = 1968;

  cout << "Enter title: ";
  getline (cin,yours.title);
  cout << "Enter year: ";
  getline (cin,mystr);
  stringstream(mystr) >> yours.year;

  cout << "My favorite movie is:\n ";
  printmovie (mine);
  cout << "And yours is:\n ";
  printmovie (yours);
  return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year << ")\n";
}
输入标题:异形
输入年份:1979年

我喜爱的电影是:
 2001太空漫游(1968)
而你的是:
 外星人(1979)


该示例示出了对象的成员如何行动就像常规的变量。例如,该部件 yours.year的类型是有效的变量 int,并且 mine.title是类型的有效变量 string

但对象 mineyours也与(的类型的类型的变量 movies_t)。例如,两者均已传递给函数 printmovie,就好像他们是简单的变量。因此,数据结构的特征之一是指两成员单独或整个结构作为一个整体的能力。在这两种情况下使用相同的标识符:该结构的名称。

因为结构类型,它们也可以用作阵列来构造它们的表或数据库的类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// array of structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
} films [3];

void printmovie (movies_t movie);

int main ()
{
  string mystr;
  int n;

  for (n=0; n<3; n++)
  {
    cout << "Enter title: ";
    getline (cin,films[n].title);
    cout << "Enter year: ";
    getline (cin,mystr);
    stringstream(mystr) >> films[n].year;
  }

  cout << "\nYou have entered these movies:\n";
  for (n=0; n<3; n++)
    printmovie (films[n]);
  return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year << ")\n";
}
输入标题:刀锋战士
输入年份:1982
输入标题:黑客帝国
输入年份:1999
输入标题:出租车司机
输入年份:1976
 
你输入这些电影:
银翼杀手(1982)
黑客帝国(1999年)
出租车司机(1976)


指针结构

像任何其他类型的,结构可以通过其自己的类型的指针被指向:

1
2
3
4
5
6
7
struct movies_t {
  string title;
  int year;
};

movies_t amovie;
movies_t * pmovie;
 


这里 amovie是结构类型的对象 movies_t,并且 pmovie是一个指针指向结构类型的对象 movies_t。因此,下面的代码也将是有效的:

 
pmovie = &amovie;
 


指针的值 pmovie将被分配对象的地址 amovie

现在,让我们看到,混合指针和结构的一个例子,将成为引入新的运营商:箭头操作符( ->):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// pointers to structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
};

int main ()
{
  string mystr;

  movies_t amovie;
  movies_t * pmovie;
  pmovie = &amovie;

  cout << "Enter title: ";
  getline (cin, pmovie->title);
  cout << "Enter year: ";
  getline (cin, mystr);
  (stringstream) mystr >> pmovie->year;

  cout << "\nYou have entered:\n";
  cout << pmovie->title;
  cout << " (" << pmovie->year << ")\n";

  return 0;
}
输入标题:身体抢夺入侵
输入年份:1978
 
您已进入:
身体掠夺者入侵(1978)


箭头符( ->)]是与指针专门用于具有成员对象引用操作。这个操作符的作用是直接从地址访问对象的成员。例如,在上面的例子:

 
pmovie->title
 


是,对于所有目的,相当于: 

 
(*pmovie).title
 


两个表达式, pmovie->title并且 (*pmovie).title是有效的,而这两个访问构件 title由称为指针指向的数据结构 pmovie。这肯定比一些不同的东西:

 
*pmovie.title
 


这是相当等同于:

 
*(pmovie.title)
 


这将访问由称为假想指针成员指出的值 title的结构的对象 pmovie(它是不是这种情况,因为 title不是指针类型)。以下面板总结了运营商的指针和结构成员的可能的组合:

表达什么是评估当量
a.b会员b对象a 
a->b会员b对象的指向a(*a).b
*a.b值指向成员b对象a*(a.b)

嵌套结构

结构也可以嵌套在这样的方式的结构的元件是本身另一种结构:

1
2
3
4
5
6
7
8
9
10
11
12
struct movies_t {
  string title;
  int year;
};

struct friends_t {
  string name;
  string email;
  movies_t favorite_movie;
} charlie, maria;

friends_t * pfriends = &charlie;
 


以前的声明之后,所有的下列表达式是有效的:

1
2
3
4
charlie.name
maria.favorite_movie.title
charlie.favorite_movie.year
pfriends->favorite_movie.year
 


(其中,顺便说一下,在过去两个表达式指的是相同部件)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值