结构体数据类型使用的一些注意点

1.结构体定义时的注意事项:

1.错误定义结构体:

struct students
{
	char name[9] = "Mike";
	int height = 185;
};

  这是不对的,在 C 语言中,这是由语言的设计原则所决定的。结构体的定义(struct declaration)只是决定了数据的布局和类型。在这个期间,并没有为这些数据分配内存。只有当你声明一个特定的结构体变量时,内存才会被分配,并且你可以在此时为它赋值(初始化)。这是因为结构体定义是用于创建一种新的类型,而不是创建一个变量。类型是一种抽象的概念,没有实际的存储空间,所以不能为其直接赋值。

2.正确定义结构体:

  在 C 语言中,你不能在结构体定义的时候直接赋初值。应该在声明结构体变量的时候,或是在定义之后,对单个变量进行初始化操作。

比如:

struct students
{
    char name[9];
    int height;
};

// 在声明变量时进行初始化
struct students aStudent = {"John", 180};

// 或在定义后对单个变量进行初始化
aStudent.height = 180;
strcpy(aStudent.name, "John");

2.结构体变量赋值:

在C语言中,主要有三种方式可以为结构体变量赋值:

//1. 声明时初始化:
struct student {
    char name[10];
    int age;
} stu = {"Tom", 20};


  在这个例子中,我们在声明student结构体的时候同时创建了一个名为stu的变量,并为其赋值了初始值。

//2. 使用**句点运算符**(.):
struct student stu;
strcpy(stu.name, "Tom");
stu.age = 20;

  在这个例子中,我们首先声明了一个名为stu的student结构体变量,然后使用句点运算符为其各成员赋值。这里就要注意,字符数组或字符串赋值最好使用string.h包含的strcpy()函数赋值,方便很多。

//3. **复制另一个相同类型的结构体变量**:
struct student stu1 = {"Tom", 20};
struct student stu2 = stu1;

  这个方法在交换两个结构变量时非常好用,以下举个快速排序学生成绩(由高到低)的示例,展示如何使用以上所说注意事项。

// 引用所需的头文件
#include
#include

// 定义结构体类型,并为成员分配内存空间
typedef struct students
{
	char name[9]; // 学生姓名,允许的最大长度为8个英文字母
	int height;   // 学生身高,区间在30-300之间
} Students;

// 快速排序算法函数实现
void quick_sort(Students student[], int left, int right)
{
	int i = left;
	int j = right;
	Students temp1;
	Students temp2 = student[left];

	if (i > j)
	{
		return; // 递归终止条件,i大于j时,返回上一级
	}

	while (i != j)
	{
		// 从右往左找比temp2.height值小的学生
		while (student[j].height <= temp2.height && i < j)
		{
			j--;
		}
		// 从左往右找比temp2.height值大的学生
		while (student[i].height >= temp2.height && i < j)
		{
			i++;
		}
		// 交换两个学生位置
		if (i < j)
		{
	        temp1 = student[i];
            student[i] = student[j];
            student[j] = temp1;
		}
	}

	// 将基准值放在正确的位置
    student[left] = student[i];
    student[i] = temp2;

	// 递归调用快速排序算法处理基准值左侧的学生
	quick_sort(student, left, i - 1);
	// 递归调用快速排序算法处理基准值右侧的学生
	quick_sort(student, i + 1, right);
}

int main()
{
	// 输入数据
	int N = 0; // 总人数
	Students student[10001];

	// 输入学生总数N
	scanf("%d", &N);

	// 逐行输入学生的名字和身高
	for (int i = 0; i < N; i++)
	{
		scanf("%s %d", student[i].name, &student[i].height);
	}

	// 使用快速排序算法将学生按身高升序排序
	quick_sort(student, 0, N - 1);

    // 输出排序后的学生名单
	for (int i = 0; i < N; i++)
	{
		printf("%s %d\n", student[i].name, student[i].height);
	}

	return 0;
}

  注意看代码中在交换两个结构变量时,可以直接把一个变量值赋值给另一个相同类型的结构变量,非常方便,这里要记住这个用法

运行结果:

//测试用例:
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159


//输出结果:
Joe 190
Tom 188
Nick 186
Bob 175
Mike 170
Eva 168
Ann 168
Tim 160
Amy 160

你可能感兴趣的:(C语言学习难点整理,算法,c语言)