数据结构的桥梁---结构体(重要)

简介: 数据结构的桥梁---结构体(重要)

宝剑锋从磨砺出,梅花香自苦寒来!


结构体


结构体 (struct)指的是一种 数据结构 ,是C语言中 复合数据类型 (aggregate data type)的一类。 结构体可以被声明为 变量 、 指针 或 数组 等,用以实现较复杂的数据结构。. 结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。.


一.结构体基本概念


结构体属于用户自定义的数据类型,允许用户存储不同的数据类型


二.结构体定义和使用


语法: struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

1)struct 结构体名 变量名

2)struct 结构体名 变量名 = { 成员1值 , 成员2值...}

3)定义结构体时顺便创建变量

示例:


//结构体定义
struct student
{
//成员列表
  string name; //姓名
  int age; //年龄
  int score; //分数
}stu3; //结构体变量创建方式3
int main() 
{
//结构体变量创建方式1
  struct student stu1; //struct 关键字可以省略
  stu1.name = "张三";
  stu1.age = 18;
  stu1.score = 100;
  cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" <<
  stu1.score << endl;
//结构体变量创建方式2
struct student stu2 = { "李四",19,60 };
cout << "姓名:" << stu2.name << " 年龄:" << stu2.age << " 分数:" <<
stu2.score << endl;
  stu3.name = "王五";
  stu3.age = 18;
  stu3.score = 80;
  cout << "姓名:" << stu3.name << " 年龄:" << stu3.age << " 分数:" <<
  stu3.score << endl;
  system("pause");
  return 0;
}


总结1:定义结构体时的关键字是struct,不可省略

总结2:创建结构体变量时,关键字struct可以省略


总结3:结构体变量利用操作符 ''.'' 访问成员


三.结构体数组


作用:将自定义的结构体放入到数组中方便维护

语法: struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }

示例:


//结构体定义
struct student
{
  //成员列表
  string name; //姓名
  int age; //年龄
  int score; //分数
}
int main()
   {
//结构体数组
struct student arr[3]=
{ 
  {"张三",18,80 },{"李四",19,60 },{"王五",20,70 }
};
for (int i = 0; i < 3; i++)
  {
    cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:"
    << arr[i].score << endl;
  }
system("pause");
 return 0;
  }


四.结构体指针


作用:通过指针访问结构体中的成员

利用操作符 -> 可以通过结构体指针访问结构体属性

示例:

//结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
};
int main() {
struct student stu = { "张三",18,100, };
struct student * p = &stu;
p->score = 80; //指针通过 -> 操作符可以访问成员
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score
<< endl;
system("pause");
return 0;
}

总结:结构体指针可以通过 -> 操作符 来访问结构体中的成员


五.结构体嵌套结构体


作用: 结构体中的成员可以是另一个结构体

例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

示例:

//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
};
//教师结构体定义
struct teacher
{
//成员列表
int id; //职工编号
string name; //教师姓名
int age; //教师年龄
struct student stu; //子结构体 学生
};
int main() {
struct teacher t1;
t1.id = 10000;
t1.name = "老王";
t1.age = 40;
t1.stu.name = "张三";
t1.stu.age = 18;
t1.stu.score = 100;
cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: "
<< t1.age << endl;
cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考
试分数: " << t1.stu.score << endl;
system("pause");
return 0;
}


总结:在结构体中可以定义另一个结构体作为成员,用来解决实际问题

六.结构体做函数参数

作用:将结构体作为参数向函数中传递

传递方式有两种:

值传递

地址传递

示例:


//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
};
//值传递
void printStudent(student stu )
{
stu.age = 28;
cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:"
<< stu.score << endl;
}
//地址传递
void printStudent2(student *stu)
{
stu->age = 28;
cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分
数:" << stu->score << endl;
}
int main() {
student stu = { "张三",18,100};
//值传递
printStudent(stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:"
<< stu.score << endl;
cout << endl;
//地址传递
printStudent2(&stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:"
<< stu.score << endl;
system("pause");
return 0;
}


总结:如果不想修改主函数中的数据,用值传递,反之用地址传递

七.结构体中 const使用场景

作用:用const来防止误操作

示例:


//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
};
//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
//stu->age = 100; //操作失败,因为加了const修饰
cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu-
>score << endl;
}
int main() {
student stu = { "张三",18,100 };
printStudent(&stu);
system("pause");
return 0;
}


八.习题

1.将结构体数组成绩从小到大排列

#include<stdio.h>
typedef struct student    
{
char *name;
int sno;
int age;
float score;
}Student;
void sortScore(Student st[],int len)
   {
    int flag = 0;
for(int i=0;i<len-1;i++)
{
        flag = 1;
for(int j=0;j<len-1-i;j++)
{
if(st[j].score>st[j+1].score)
 {
Student temp = st[j];
st[j] = st[j+1];
st[j+1] = temp;
 }
}
     if(flag==0)
       {
         break;
        }
}
}
void printStudent(Student stu[],int len)
{
for(int i=0;i<len;i++)
{
            printf("name:%s,sno:%d,age:%d,score:%.1f\n",stu[i].name,stu[i].sno,
    stu[i].age,stu[i].score);
}
}
int main()
{
Student stu[3] = {{"Tom",1101,18,99.2},{"Boy",1102,20,98.1},{"Smith",1103,22,99.0}};
sortScore(stu,3);
printStudent(stu,3);
return 0;
}

2.长方形问题


描述


现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);


1.按照编号从小到大排序


2.对于编号相等的长方形,按照长方形的长排序;


3.如果编号和长都相同,按照长方形的宽排序;


4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;


输入


第一行有一个整数 0


每一组第一行有一个整数 0


接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,


第二个和第三个数值大的表示长,数值小的表示宽,相等


说明这是一个正方形(数据约定长宽与编号都小于10000);


输出


顺序输出每组数据的所有符合条件的长方形的 编号 长 宽


样例输入

1

8

1 1 1

1 1 1

1 1 2

1 2 1

1 2 2

2 1 1

2 1 2

2 2 1

样例输出

1 1 1

1 2 1

1 2 2

2 1 1

2 2 1


#include<stdio.h>
#include<algorithm>
using namespace std;
struct ak
{
    int num,lenth,width;
}a[1005];
bool cmp(ak a,ak b)
{
    if(a.num<b.num)
         return 1;
    else if(a.num==b.num&&a.lenth<b.lenth)
        return 1;
    else if(a.num==b.num&&a.lenth==b.lenth&&a.width<b.width)
        return 1;
    else  return 0;
}
int main()
{
    int t,n,i,b,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&a[i].num,&b,&c);
            if(b>=c)
            {
                a[i].lenth=b;
                a[i].width=c
            }
            else
            {
                a[i].lenth=c;
                a[i].width=b;
            }        
        }
        sort(a,a+n,cmp);
        for(i=0;i<n;i++)
        {
            if(a[i].num==a[i+1].num&&a[i].lenth==a[i+1].lenth&&a[i].width==a[i+1].width)
                continue;
                printf("%d %d %d\n",a[i].num,a[i].lenth,a[i].width);
        }
    }
    return 0;
}        



相关文章
|
2天前
|
存储 编译器 Linux
【C语言】【数据结构】自定义类型:结构体
这是一篇对结构体的详细介绍,这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。
39 0
|
2天前
|
C语言 开发者
【数据结构】C语言结构体详解
【数据结构】C语言结构体详解
56 0
|
10月前
|
C语言
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
272 0
|
10月前
|
存储 编译器 C语言
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(上)
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)
102 0
|
程序员 C语言
【C语言】学数据结构前必学的结构体struct详细
本文讲解:学数据结构前必学的结构体struct详细。
|
存储 编译器 C++
【C结构体】结构体都不会,学啥数据结构(进阶版)
【C结构体】结构体都不会,学啥数据结构(进阶版)
59 0
【C结构体】结构体都不会,学啥数据结构(进阶版)
|
存储 编译器 C语言
深入理解C语言结构体(数据结构基础)
一:结构体定义与初始化引用 1:结构体是什么?它的特点? <1>相对于数组存储结构的区别? 数组是一种存储结构,一种可以存放相同类型的存储结构。比如int类型的存储结构就只能存放Int类型的数据,但是你若是想要描述清除一个学生的身份信息,一个数组绝对是不行的,比如名字,学号等这些,必须要使用多个数组来说明学生的信息。我们还需要构造关联的索引形成一一的对应,如果大型项目这样做,那么就会无比臃肿了。
200 0
深入理解C语言结构体(数据结构基础)
数据结构学习(结构体复习)
结构体 为什么会出现结构体 为了表示一些复杂的数据,而普通的基本类型变量无法满足要求 什么叫做结构体 结构体是用户根据实际需要自己定义的复合数据类型 如何使用结构体 两种方式: struct Student st = {1000,"zhangxu",20}; struct Student *pst = &st; 1.
883 0
|
2天前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
2天前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2