浅讲结构体

结构体也是一种容器;

结构体的基础

结构体可以用来存储一些变量,与数组一样,但表达形式不同;

基础表达;

1.定义;
 struct node (结构体名称){
 	int 变量;
 };
 node a[1000];
 或;
 struct node (结构体名称){
 	int 变量;
 }a[1000]2.输入:
 cin>>a[i].n(变量名);
 3.输出:
 cout<<a[i],n;
 4.排序:
 sort(a,a+n,cmp);
 bool cmp(node a,node b){
 	if(判断){
 		执行语句;
 	}
 	return a.n>b.n; 

实战:

题目描述
一年四季,寒暑交替,楠枫总是会收集每一个季节的树叶,并把它们制作成标本收集起来。当然,楠枫的收集很讲究,一片树叶不仅要标注收集的日期、收集地点,还要给他们分类。可是分类是个很繁琐的工作,不仅要查阅大量相关资料,还要小心求证分类是否正确。因此,楠枫请求小伙伴们帮忙查阅资料给树叶分类,以减轻自己的工作量。最后,需要你整理一下他们的分类结果,按次序列出所有树叶标本的信息。

输入格式
第一行一个整数
𝑛
n ,表示树叶标本的个数。
下来
𝑛
n 行,每行三个数据,分别表示树叶编号、收集日期、收集地点。
接下来
𝑛
n 行,每行两个数据,分别表示树叶编号和该片树叶的分类。
保证树叶编号不会重复,且全部由
4
4 位数字表示。

输出格式
总共
𝑛
n 行,每行一个分类好的树叶标本信息,分别表示该片树叶的所属分类、收集日期、收集地点和树叶编号。
注意,树叶标本信息优先按分类的字典序从小往大列出,同分类下的按照收集日期从早到晚列出,若是收集日期仍相同,需按收集地点的字典序从小到大列出,若是仍相同,则按树叶编号从小往大列出。

样例
Input 1
7
2145 1998-07-29 muzzkg
3314 2022-04-20 wkjneg
4637 2000-08-14 oacbtz
6156 2007-01-22 elmtry
6496 1997-12-11 qodkrc
7610 1995-04-20 otlahk
9703 2004-07-01 dxzcss
3314 LUVJ
2145 SQPE
6156 SQPE
9703 FVJS
4637 LUVJ
7610 GVQP
6496 LUVJ
Output 1
FVJS 2004-07-01 dxzcss 9703
GVQP 1995-04-20 otlahk 7610
LUVJ 1997-12-11 qodkrc 6496
LUVJ 2000-08-14 oacbtz 4637
LUVJ 2022-04-20 wkjneg 3314
SQPE 1998-07-29 muzzkg 2145
SQPE 2007-01-22 elmtry 6156
数据范围
1≤𝑛≤1000

这是一道基础的结构体排序问题;
上code:

#include<bits/stdc++.h>
using namespace std;
int n;
struct fit{
	int biand;
	string fenj;
}a[1010];
struct fie{
	string fen,place,riqi;
	int bian;
}b[1010];
bool cmp(fie k,fie p){
	if(k.fen!=p.fen){
		return k.fen<p.fen;
	}else{
		if(k.riqi!=p.riqi){
			return k.riqi<p.riqi;
		}else{
			if(k.place!=p.place){
				return k.place<p.place;
			}else{
				if(k.bian!=p.bian){
					return k.bian<p.bian;
				}
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>b[i].bian>>b[i].riqi>>b[i].place;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].biand>>a[i].fenj;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[j].biand==b[i].bian){
				b[i].fen=a[j].fenj;
			}
		}
	}
	sort(b+1,b+1+n,cmp);
	for(int i=1;i<=n;i++){
		cout<<b[i].fen<<" "<<b[i].riqi<<" "<<b[i].place<<" "<<b[i].bian<<endl; 
	}
	return 0;
}
//3
//1324 1972-09-27 fdwkblw
//8477 1938-01-27 vhjbsiv
//2930 1839-02-23 KSDvbva
//8477 HGUYG
//2930 HUBFJ
//1324 KGNVH

//2
//2930 3293-01-04 hmbjhbgf
//7483 7364-05-06 dhdbcjdd
//7483 GSJDH
//2930 KASHS

最后留几道习题:
链接:洛谷
链接:奖学金

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体在C语言中是一种用户自定义的数据类型,它可以包含多个不同类型的变量。在进行拷贝操作时,可以使用深拷贝或拷贝。 拷贝是指将一个结构体的成员值复制到另一个结构体中,如果结构体成员中有指针类型,则只是复制了指针的地址,而没有复制指针所指向的实际内容。这样,在修改其中一个结构体的成员时,可能会影响到另一个结构体。 深拷贝是指将一个结构体的成员值以及指针所指向的内容全部复制到另一个结构体中。这样,在修改其中一个结构体的成员时,不会影响到另一个结构体。 以下是一个示例代码,展示了如何进行深拷贝和拷贝: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义一个结构体 typedef struct { int id; char name[20]; char* address; } Person; // 拷贝函数 void shallowCopy(Person* dest, Person* src) { *dest = *src; } // 深拷贝函数 void deepCopy(Person* dest, Person* src) { *dest = *src; dest->address = (char*)malloc(strlen(src->address) + 1); strcpy(dest->address, src->address); } int main() { // 原始结构体 Person person1; person1.id = 1; strcpy(person1.name, "John"); person1.address = "123 Main St"; // 拷贝 Person person2; shallowCopy(&person2, &person1); // 深拷贝 Person person3; deepCopy(&person3, &person1); // 修改person1的成员 person1.id = 2; strcpy(person1.name, "Mike"); person1.address = "456 Park Ave"; // 输出结果 printf("Person 1: %d %s %s\n", person1.id, person1.name, person1.address); printf("Person 2: %d %s %s\n", person2.id, person2.name, person2.address); printf("Person 3: %d %s %s\n", person3.id, person3.name, person3.address); // 释放内存 free(person3.address); return 0; } ``` 上述代码中,我们定义了一个Person结构体,包含id、name和address三个成员。然后我们实现了一个拷贝函数shallowCopy和一个深拷贝函数deepCopy,分别进行拷贝和深拷贝操作。 在主函数中,我们创建了一个原始结构体person1,并将其分别进行了拷贝和深拷贝到person2和person3中。接着修改了person1的成员,然后输出三个结构体的成员值,可以看到拷贝只复制了指针地址,而深拷贝复制了指针所指向的内容。 需要注意的是,对于深拷贝操作,我们还需要手动释放内存,以避免内存泄漏。在上述代码中,我们使用了malloc函数为address成员分配了内存,在释放person3时需要使用free函数释放该内存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值