首页 > 其他分享 >c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构体数组,指向结构体数据类型的指针,用指针处理链表

c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构体数组,指向结构体数据类型的指针,用指针处理链表

时间:2024-08-02 19:24:31浏览次数:12  
标签:Node head struct 链表 结构 变量 指针

1. C语言结构体的概述

在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如 int、float、char 等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含 x 和 y 坐标)。

结构体的定义使用关键字 struct,可以在函数之外(全局)或函数内部定义。全局定义的结构体可以在程序的任何地方使用,而局部定义的结构体仅限于函数内部。

2. 定义结构体变量类型的方法

定义结构体类型的一般形式如下:
struct 结构体名 {
    数据类型1 成员名1;
    数据类型2 成员名2;
    // 更多成员
};

例如,定义一个表示学生信息的结构体类型:
struct Student {
    int id;
    char name[50];
    float grade;
};

在这个结构体中,有三个成员:id(整数类型),name(字符数组类型,用于存储学生姓名),和 grade(浮点数类型,表示成绩)。

 3. 结构体变量的引用

定义好结构体类型后,可以声明结构体变量来存储数据。结构体变量的声明方式类似于基本数据类型:
struct Student student1;

可以通过点运算符 . 来访问结构体的成员:
student1.id = 1;
strcpy(student1.name, "Alice");
student1.grade = 89.5;

在这个例子中,我们设置了 student1 的 id 为 1,name 为 "Alice",grade 为 89.5。

4. 结构体变量的初始化

结构体变量可以在声明时初始化:
struct Student student1 = {1, "Alice", 89.5};

此初始化方式按照成员声明的顺序依次赋值。此外,也可以使用指定初始化:
struct Student student1 = {.name = "Alice", .id = 1, .grade = 89.5};

指定初始化使代码更具可读性和灵活性,尤其是在结构体成员较多时。

5. 结构体数组

结构体数组用于存储多个相同类型的结构体变量,是一种便捷的数据组织方式。例如,定义一个学生数组来存储多个学生的信息:
struct Student students[3] = {
    {1, "Alice", 89.5},
    {2, "Bob", 78.9},
    {3, "Charlie", 92.3}
};

可以使用数组下标来访问和操作这些结构体:
printf("First student: %s\n", students[0].name);
students[1].grade = 85.0;

6. 指向结构体数据类型的指针

和其他数据类型一样,C 语言允许使用指针指向结构体。指针不仅可以节省内存,而且可以方便地传递大型结构体作为参数。

定义结构体指针并访问成员的一般形式如下:
struct Student *ptr;
ptr = &student1;

// 使用箭头运算符 -> 访问成员
printf("ID: %d\n", ptr->id);

这里 ptr 是一个指向 Student 结构体的指针。使用箭头运算符 -> 可以访问指针指向的结构体成员。

7. 用指针处理链表

链表是一种动态数据结构,其中的元素被称为节点。每个节点包含数据和一个指向下一个节点的指针。链表通过指针实现灵活的内存使用,可以动态增删节点。链表有多种类型,如单向链表、双向链表和循环链表。

7.1 单向链表示例
单向链表中的每个节点包含数据和一个指向下一个节点的指针。链表通常有一个头指针指向第一个节点。

节点的结构定义:
struct Node {
    int data;
    struct Node* next;
};

创建链表并插入节点:
struct Node* head = NULL; // 初始化链表为空

void push_front(struct Node** head_ref, int new_data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    if (new_node == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return;
    }
    new_node->data = new_data;
    new_node->next = *head_ref;
    *head_ref = new_node;
}

push_front(&head, 10);
push_front(&head, 20);
push_front(&head, 30);

在这个例子中,push_front 函数在链表的头部插入新节点。head_ref 是指向头指针的指针,这使得可以直接修改头指针。

7.2 遍历和操作链表
可以通过遍历链表来访问和操作节点数据:
void print_list(struct Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
    printf("\n");
}

print_list(head); // 输出:30 20 10

 7.3 删除链表
删除链表时,需要释放所有节点的内存,以防止内存泄漏:
void free_list(struct Node* head) {
    struct Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

free_list(head);

标签:Node,head,struct,链表,结构,变量,指针
From: https://blog.csdn.net/lexc_/article/details/140853636

相关文章

  • 【数据结构算法经典题目刨析(c语言)】判断链表是否有环(图文详解)
    ......
  • 数据结构———栈
    目录基本概念常用操作栈的实现1. 基于链表的实现2. 基于数组的实现实现之间的对比栈的典型应用基本概念栈(stack)是一种遵循先入后出逻辑的线性数据结构。我们可以将栈类比为枪械上的弹夹,如果想打出底部的子弹,则需要先将上面的子弹依次移走。我们将子弹替换为......
  • java如何避免NullPointerException(空指针异常,NPE)
    本文将简单的介绍nep以及如何避免npe1.npe简介空指针异常(NullPointerException)意思是指java中的异常类。当应用程序试图在需要对象的地方使用null时,抛出该异常。这种情况包括:调用null对象的实例方法。访问或修改null对象的字段。将null作为一个数组,获得其长度......
  • 嵌入式控制器(STM32)->栈指针累寄存器
    全局变量和局部变量从存储角度理解全局变量具有固定的地址,每次读写都是一个地址,而且它的存储区域从使用到使用结束一直存在局部变量再RAM中的地址不固定,采用先进后出的RAM区域,称为栈区寄存器分为通用寄存器(R0-R12)和特殊寄存器(R13-R15)ARM基本指令系统数据传送,数据操作,跳......
  • 大话C语言:第34篇 指针与函数的关系
    1指针作为函数的参数指针作为函数的参数,语法格式:返回数据类型函数名(数据类型*指针变量1,...,数据类型*指针变量1)注意,指针变量的数据类型可以为任何数据类型,包括基本数类型和自定义数据类型代码示例:voidswap(int*ptr1,int*ptr2){//提前保存ptr1指向对象......
  • 数据结构: 单向链表
    目录一、链表的概念及结构二、单链表的实现2.1头文件2.2各个功能的实现2.2.1内存申请 2.2.2头插,尾插,头删,尾删头插 尾插 头删尾删 2.2.3查找数据 2.2.4指定位置前中后的数据增删指定位置之前插入数据指定位置之后插入数据删除指定位置之后数据删......
  • wincc v8 连接opc ua 变量失败处理
     kepserverex作为opc服务器.wincc更改计算机名称后opcua变量连接不上.需要重新安装证书.打开证书管理器WinCCCertificateManager"C:\ProgramFiles(x86)\Siemens\WinCC\bin\Siemens.CertManagerWinApp.exe"组态里面添加设备,当前计算机名,添加证书再右键安装所有证书.......
  • 【C++】学习笔记——智能指针
    文章目录二十一、智能指针1.内存泄漏2.智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器未完待续二十一、智能指针1.内存泄漏在上一章的异常中,我们了解到如果出现了异常,会中断执行流,跳转到catch处。但......
  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 数据结构与算法-二分搜索树节点的查找
    ......