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

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

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


结构体


结构体 (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;
}        



相关文章
|
25天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
44 4
|
4月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
132 7
|
6月前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
43 0
|
6月前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
34 0
实验:数据结构(结构体在单链表中的增删改查)
实验:数据结构(结构体在单链表中的增删改查)
|
7月前
|
存储 编译器 Linux
【C语言】【数据结构】自定义类型:结构体
这是一篇对结构体的详细介绍,这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。
94 0
|
7月前
|
C语言 开发者
【数据结构】C语言结构体详解
【数据结构】C语言结构体详解
119 0
|
C语言
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
292 0
|
存储 编译器 C语言
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(上)
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)
121 0
|
程序员 C语言
【C语言】学数据结构前必学的结构体struct详细
本文讲解:学数据结构前必学的结构体struct详细。

热门文章

最新文章