关于动态(长度不定)结构体数组的两种处理方法

讲解这个问题,以一个例子入手:PAT(A)1080 Graduate Admission

方法一:
定义一个结构体数组,为该数组开辟一块大的存储空间,然后进行初始化赋值。

#include<iostream>

using namespace std;

struct student {
    
    
	int ge;
	int gi;
	int b[6] = {
    
     0 };
};

int main()
{
    
    
	struct student *stu;
	int n, m, k;
	// n申请人总数,m研究生院总数,k申请人可以选择的数量
	cin >> n >> m >> k;
	/*
	int a[101] = { 0 }; // 每个研究生院的配额
	for (int i = 0; i < m; i++)
	{
		int g;
		cin >> g;
		a[i] = g;
	}
	*/
	//为结构体分配存储空间
	stu = (struct student *)malloc(40000* sizeof(struct student));
	for (int i = 0; i < n; i++) // 为所有学生输入他的各项信息
	{
    
    
		int c, d, e;
		cin >> c >> d;
		stu[i].ge = c;
		stu[i].gi = d;
		for (int j = 0; j < k; j++)
		{
    
    
			cin >> e;
			stu[i].b[j] = e;
		}
	}
	for (int i = 0; i < n; i++)
		for(int j=0; j<k; j++)
		cout << stu[i].ge << "  " << stu[i].gi << "  " << stu[i].b[j] << endl;

	system("pause");
	return 0;
}

输入:
3 6 3
100 100 0 1 2
60 60 2 3 5
100 90 0 3 4

输出:
在这里插入图片描述
通过输出可以发现,输入的数据都存入了对应每个学生结构体的各项信息中。

方法二:
通过vector来进行动态数组的赋值操作

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct stu {
    
    
    int id;
    double g1, g2;
    int choice[6];
};

int main() 
{
    
    
    int n, m, k;
	cin>>n>>m>>k;
    vector<stu> students; 
	stu tmp;
    for (int i = 0; i < n; i++) 
	{
    
    
        tmp.id = i;
        int a,b;
		cin>>a>>b;
		tmp.g1=a;
		tmp.g2=b;
        for (int j = 0; j < k; j++) 
        {
    
    
            int c;
            cin>>c;
		    tmp.choice[j]=c;
		}
        students.push_back(tmp);
    }
    
	for(int i=0; i<n; i++)
	{
    
    
		for(int j=0; j<k; j++)
		cout<<students[i].g1<<"  "<<students[i].g2<<"  "<<students[i].choice[j]<<endl;
	} 
	
    return 0;
}

输入:
5 6 3
100 100 0 1 2
60 60 2 3 5
100 90 0 3 4
90 100 1 2 0
90 90 5 1 3

输出:
在这里插入图片描述
通过输出可以发现,输入的数据都存入了对应每个学生结构体的各项信息中。

故对于动态数组结构体的处理,有以上两种方法,关于PAT(A)1080 的详细的解题过程及代码,参见其他博客。

猜你喜欢

转载自blog.csdn.net/qq_27538633/article/details/105778167