第七章 结构体
复习:
结构体类型的定义:

数据类型如果未定义变量,不占据内存。
结构体变量的定义:
结构体变量的初始化与赋值:
结构体变量的输入与输出:
#include < iostream>
#include < cstring>;
using namespace std;
struct student
{
int num;//学号
char name[20];//姓名
float score;//成绩
};
int main()
{
struct student s1={10001,“张三丰”,88};//C语言方式
student s2;//C++方式 每个结构体变量所占空间数是所有成员组合
//s2={10001,“张三丰”,88} //语法错误
//cin>>s2;// 语法错误
s2.num=10002;
//s2.name=“张无忌”;//语法错误,字符数组不允许直接赋值
strcpy(s2.name,“张无忌”);//strlen strcpy strcmp strcat 需要 Cstring
//cout<<s1<<endl;错误
s2.score=77;
cout<<“学号:” <<s1.num<<endl;
cout<<“姓名:”<<s2.name<<endl;
cout<<“成绩:”<<s2.score<<endl;
return 0;
}
11 结构体数组
#include < iostream>
#include < iomanip>//控制输出格式的头文件
#include < cstring>;
using namespace std;
struct person
{
char name[20];
int count;
};
int main()
{
struct person leaders[3]={{“zhang”,0},{“li”,0},{“wang”,0}};
int i,j;
char name[20];
//外层循环10次,是10人参加投票。
for(i=0;i<10;i++)
{
cout<<“输入候选人姓名:”;
cin>>name;
//内层循环3次,与三名候选人的姓名做对比
for(j=0;j<3;j++)
{
if(strcmp(name,leaders[j].name)==0)
{
leaders[j].count++;
break;
}
}
}
for(i=0;i<3;i++)
{
cout<<setw(10)<<leaders[i].name<<" "<<leaders[i].count<<endl;
}
return 0;
}
#include< iostream>
#include< string>
using namespace std;
struct Person
{ //声明结构体类型Person
char name[20];
int count;
};
int main()
{
Person leader[3]= {“Li”,0,“Zhang”,0,“Sun”,0};
//定义Person类型的数组,内容为3个候选人的姓名和当前的得票数
int i,j;
char leader_name[20]; //leader_name为投票人所选的人的姓名
for(i=0; i<10; i++)
{
cin>>leader_name; //先后输入10张票上所写的姓名
for(j=0; j<3; j++) //将票上姓名与3个候选人的姓名比较
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
//如果与某一候选人的姓名相同,就给他加一票
}
cout<<endl;
for(i=0; i<3; i++)
{ //输出3个候选人的姓名与最后得票数
cout<<leader[i].name<<“:”<<leader[i].count<<endl;
}
system(“pause”);
return 0;
}
#include< iostream>
#include< string>
using namespace std;
struct person
{
string name;//成员name为字符串变量
int count;
} leader[3]= {“Li”,0,“Zhang”,0,“Sun”,0};
int main()
{
int i,j;
string leader_name; //leader_name为字符串变量
for(i=0; i<10; i++)
{
cin>>leader_name;
for(j=0; j<3; j++)
if(leader_name= =leader[j].name)leader[j].count++; //用"==“进行比较
}
cout<<endl;
for(i=0; i<3; i++)
{
cout<<leader[i].name<<”:"<<leader[i].count<<endl;
}
system(“pause”);
return 0;
}
12 结构体类型指针
如何通过结构体类型指针访问结构体类型变量及每个成员。
#include < iostream>
#include < cstring>;
using namespace std;
struct student
{
int num;//学号
char name[20];//姓名
float score;//成绩
};
int main()
{
struct student s1={10001,“张三丰”,88};
student s2;
student *p;
s2.num=10002;
strcpy(s2.name,“张无忌”);
s2.score=77;
cout<<“学号:”<<s2.num<<endl;
cout<<“姓名:”<<s2.name<<endl;
cout<<“成绩:”<<s2.score<<endl;
//用三种方式输出s1
cout<<“学号:”<<s1.num<<endl;
cout<<“姓名:”<<s1.name<<endl;
cout<<“成绩:”<<s1.score<<endl;
p=&s1;
//2种方式通过指针来访问
cout<<“学号:”<<(*p).num<<endl; //成员访问 运算符 .级别高
cout<<“姓名:”<<(*p).name<<endl;
cout<<“成绩:”<<(*p).score<<endl;
cout<<“学号:”<num<<endl; //成员访问 运算符 .级别高
cout<<“姓名:”<name<<endl;
cout<<“成绩:”<score<<endl;
return 0;
}
#include< iostream>
#include< string>
using namespace std;
int main()
{
struct Student { //声明结构体类型Student
int num;
string name;
char sex;
float score;
};
Student stu; //定义Student类型的变量stu
Student *p=&stu; //定义p为指向Student类型数据的指针变量并指向stu
stu.num=10301; //对stu中的成员赋值
stu.name=“Wang Fang”; //对string变量可以直接赋值
stu.sex=‘f’;
stu.score=89.5;
cout<<stu.num<<" “<<stu.name<<” “<<stu.sex<<” “<<stu.score<<endl;
cout<<(*p).num<<” “<<(*p).name<<” “<<(*p).sex<<” “<<(*p).score<<endl;
cout<num<<” “<name<<” “<sex<<” "<score<<endl;
system(“pause”);
return 0;
}
13 结构体类型指针的应用,让结构体变量手拉手。
#define NULL 0//此行可省略,因为在头文件iostream中已有此定义
#include< iostream>
using namespace std;
struct student {
int num;
float score;
struct student *next;
};
int main()
{
student a,b,c, *head, *p;
a.num=31001;
a.score=89.5; //对结点a的num和score成员赋值
b.num=31003;
b.score=90; //对结点b的num和score成员赋值
c. num=31007;
c.score=85; //对结点c的num和score成员赋值
head=&a; //将结点a的起始地址赋予头指针head
a.next=&b; //将结点b的起始地址赋予a结点的next成员
b.next=&c; //将结点c的起始地址赋予b结点的next成员
c.next=NULL; //结点的next成员不存放其他结点地址
p=head; //使p指针指向a结点
do {
cout<num<<" "<score<<endl; //输出p指向的结点的数据
p=p->next; //使p指向下一个结点
}
while(p!=NULL); //输出完c结点后p的值为NULL
system(“pause”);
return 0;
}
#include < iostream>
#include < cstring>;
using namespace std;
struct student
{
int num;//学号
float score;//成绩
struct student *next;//保存下一个变量的地址
};
int main()
{
struct student s1={111,111},s2={222,222},s3={333,333};
s1.next=&s2;
s2.next=&s3;
s3.next=NULL;
struct student p;
/
p=&s1;
cout<num<<" " <score<<endl;
p=p->next;
cout<num<<" " <score<<endl;
p=p->next;
cout<num<<" " <score<<endl;
p=p->next;
cout<num<<" " <score<<endl;
*/
p=&s1;
while(p!=NULL)
{
cout<num<<" " <score<<endl;
p=p->next;
}
return 0;
}
14 结构体类型数据作为函数参数
(1) 用结构体变量名作参数。(无法通过函数改变结构体变量的值)
#include< iostream>
#include< string>
using namespace std;
struct Student { //声明结构体类型Student
int num;
string name;
float score[3];
};
int main()
{
void print(Student); //函数声明,形参类型为结构体Student
Student stu; //定义结构体变量
stu.num=12345; //以下5行对结构体变量各成员赋值
stu.name=“Li Fang”;
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
print(stu); //调用print函数,输出stu各成员的值
system(“pause”);
return 0;
}
void print(Student stu)
{
cout<<stu.num<<" “<<stu.name<<” “<<stu.score[0]<<” "
<<stu.score[1]<<" "<<stu.score[2]<<endl;
}
(2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
#include< iostream>
#include< string>
using namespace std;
struct Student { //声明结构体类型Student
int num;
string name;
float score[3];
};
int main()
{
void print(Student*); //函数声明,形参类型为结构体Student
Student stu,*p=&stu; //定义结构体变量
stu.num=12345; //以下5行对结构体变量各成员赋值
stu.name=“Li Fang”;
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
print(&stu); //调用print函数,输出stu各成员的值
print§;
system(“pause”);
return 0;
}
void print(Student *p)
{
cout<num<<" “<name<<” “<score[0]<<” "
<score[1]<<" "<score[2]<<endl;
}
(3) 用结构体变量的引用作函数形参,它就成为实参(是结构体变量)的别名。
#include< iostream>
#include< string>
using namespace std;
struct Student { //声明结构体类型Student
int num;
string name;
float score[3];
};
int main()
{
void print(Student &); //函数声明,形参类型为结构体Student
Student stu; //定义结构体变量
stu.num=12345; //以下5行对结构体变量各成员赋值
stu.name=“Li Fang”;
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.5;
print(stu); //调用print函数,输出stu各成员的值
system(“pause”);
return 0;
}
void print(Student &stu)
{
cout<<stu.num<<" “<<stu.name<<” “<<stu.score[0]<<” "
<<stu.score[1]<<" "<<stu.score[2]<<endl;
}
#include < iostream>
#include < cstring>;
using namespace std;
struct student
{
int num;//学号
char name[20];//姓名
float score;//成绩
};
void priStu(student s);
void priStu2(student *ps);
void change(student s) ;
void change2(student s) ;
void change3(student &s) ;
int main()
{
struct student s1={10001,“张三丰”,88};
student s2;
s2.num=10002;
strcpy(s2.name,“张无忌”);
s2.score=77;
/
cout<<“学号 :”<<s1.num<<endl;
cout<<“姓名 :”<<s1.name<<endl;
cout<<"成绩 : "<<s1.score<<endl;
cout<<“学号 :”<<s2.num<<endl;
cout<<“姓名 :”<<s2.name<<endl;
cout<<"成绩 : "<<s2.score<<endl;
*/
//priStu(s1);
//priStu(s2);
priStu2(&s1);
//change(s1);
//change2(&s1);
change3(s1);
priStu2(&s1);
return 0;
}
//编写一个函数输出学生信息
//使用结构体类型变量做为参数
void priStu(student s)
{
cout<<“学号 :”<<s.num<<endl;
cout<<“姓名 :”<<s.name<<endl;
cout<<"成绩 : "<<s.score<<endl;
}
//使用结构体类型指针做为参数
void priStu2(student *ps)
{
cout<<“学号 :”<num<<endl;
cout<<“姓名 :”<name<<endl;
cout<<"成绩 : "<score<<endl;
}
//编写一个函数 将变量的成绩加10 应该使用何种参数 变量?指针
void change(student s) //传递的参数是结构体变量时,不会被改变。形参与实参占据不同的内存
{
s.score+=10;
}
void change2(student *s) //通过指针变量可以
{
s->score+=10;
}
void change3(student &s) //通过引用可以
{
s.score+=10;
}
15 new(向系统动态申请空间,无变量名,但有地址,只能通过指针变量才能使用这段地址) delete(回收动态申请的空间)
new运算符的例子:
new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); //开辟存放一个整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回字符数组首元素的地址
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float p=new float(3.14159)//开辟一个存放单精度数的空间,并指定该数的初值为3.14159,将返回的该空间的地址赋给指针变量p
new运算符使用的一般格式为
new 类型(初值)
注意: 用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
delete运算符使用的一般格式为
delete 指针变量(对变量)
或
delete [] 指针变量 (对数组)
#include< iostream>
#include< string>
using namespace std;
struct Student
{ //声明结构体类型Student
int num;
string name;
char sex;
};
int main()
{
Student *p; //定义指向结构体类型Student的数据的指针变量p
p=new Student; //用new运算符开辟一个存放Student型数据的空间,把地址赋给p
p->name=“Wang Fang”; //向结构体变量的成员赋值
p->num=10123;
p->sex=‘m’;
cout<name<<endl<num<<endl<sex<<endl; //输出各成员的值
delete p;
system(“pause”);
return 0;
}