首页 > 其他分享 >结构体与共用体,链表的学习

结构体与共用体,链表的学习

时间:2024-08-03 19:53:05浏览次数:12  
标签:Node 学习 struct int void 链表 Student 共用 name

结构体

定义

        C语言允许用户自己定义一种数据结构,称为结构体。

        声明一个结构体类型一般形式为:

                strcut  结构体名

                {

                        成员列表

                };

struct Student
{
    int id;
    float score;
    char name[10];
}; //";"不能丢失

int main(void)
{
    int i;
    struct Student s;
    
    s.id = 1;
    s.score = 95.5;
    strcpy(s.name, "zhangsan");

    printf("%d, %f, %s\n", s.id, s.score, s.name);

    return 0;
}

也可以直接初始化为:

struct Student s = {1, 95.5, "zhangsan"};

struct Student s = {.score = 95.5, .name = "zhangsan"}; //部分初始化

结构体对齐原则

  1. 结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
  2. 结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
  3. 如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
  4. 用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。

结构体传参

struct Student
{
    int id;
    float score;
    char name[10];
};

void printStudent(struct Student *s) //打印
{
    printf("%d, %f, %s\n", s->id, s->score, s->name);
}

void printStudents(struct Student *s,int len) //遍历
{
    int i;
    for(i = 0;i < len;++i)
    {
      
        printStudent(s + i);
    }
}

void swap(struct Student *p1,struct Student *p2) //交换
{
    
    struct Student t;
    t = *p1;
    *p1 = *p2;
    *p2 = t;
}

void fn(struct Student *s) //用指针指向id对结构体中id的数值进行
{
    s->id += 10;
}

void revsers(struct Student *a, int len) //逆序
{
    int i;
    for(i = 0;i < len / 2;++i)
    {
        swap(a + i, a + len - i - 1);
    }
}

void sortByScore(struct Student *a, int len) //用结构体中的“score”排序
{
    int i, j;
    for(i = 0;i < len - 1;++i)
    {
        for(j = i + 1;j < len;++j)
        {
            if(a[i].score > a[j].score)
            {
                swap(a + i, a + j);
            }
        }
    }
}
void sortMoScore(struct Student *a, int len) //用结构体中的“name”排序
{
    int i, j;
    for(j = len -1;j > 0;--j)
    {
        for(i = 0;i < j;++i)
        {
            if(strcmp((a + i)->name, (a +i+1)->name) > 0)
            {
                swap(a+i, a+i+1);
            }
        }
    }
}

int namecmp(const void *p1, const void *p2) //调用qsort函数排序 
{
    struct Student *q1 = (struct Student *)p1;
    struct Student *q2 = (struct Student *)p2;
    return strcmp(q1->name, q2->name);

   // qsort(a, len, sizeof(a[0]), namecmp);

用指针处理链表

链表由若干节点组成,节点分为值域和指针域。

首节点来自栈区,其他的都来自堆,且每一个都不连续,无法通过+1来访问下一个节点。

struct Node
{
	int data;
	struct Node *next;
};

void push_front(struct Node *pHead, int n) //头插
{
	struct Node *pNew = malloc(sizeof(struct Node));
	pNew->next = pHead->next;
	pHead->next = pNew;
	pNew->data = n;
}

void printList(struct Node *pHead) //遍历
{
	struct Node *p = pHead->next;
	while(p != NULL)
	{
		printf("%d\n", p->data);
		p = p->next;
	}
}

int size(struct Node *pHead) //计算有效节点
{
	struct Node *p = pHead->next;
	int counter = 0;
	while(p != NULL)
	{
		++counter;
		p = p->next;
	}
	return counter;
}

int isEmpty(struct Node *pHead) //判空
{
	//return size(pHead) == 0;
    return pHead->next == NULL;
}

int main(void)
{
	struct Node head = {0, NULL};
	printf("size = %d\n", size(&head));
	printf("isEmpty = %d\n", isEmpty(&head));
	push_front(&head, 1);
	push_front(&head, 2);
	push_front(&head, 3);
	push_front(&head, 4);
	printList(&head);

	printf("isEmpty = %d\n", isEmpty(&head));
	printf("size = %d\n", size(&head));
	return 0;
}

标签:Node,学习,struct,int,void,链表,Student,共用,name
From: https://blog.csdn.net/qq_69639971/article/details/140854800

相关文章

  • 第五周学习报告
    又经过了一周的学习,今天对本周学习进行总结本周学习了Java面向对象进阶内容static静态变量无论创建了多少个类的对象,静态变量都只有一份拷贝,被该类的所有对象共享。静态变量通过在变量声明前加上static关键字来声明。publicclassMyClass{//静态变量static......
  • JAVA学习第五周
    这周也是我在学习Java道路上的第五周了,在这一周里并没有学太多新的东西,更多的还是复习了之前所学的东西,在Java这几周的学习中更多的不懂的地方还是集中在面向对象那几章节,尤其是面向对象的三大特点封装,继承和多态。这几部分刚开始看感觉还可以看懂一点,越看越看不懂,有时候多态和继......
  • 嵌入式学习---DAY18:shell脚本
    shell脚本文件进程网络HtmlDbshell脚本是一系列shell命令的集合。  shell  命令解释器shell编程:解释型语言、边翻译边执行、擅长文件处理,操作系统管理、开发效率高  cp 1  2、执、效率低、移植性好C语言:编译型语言、先编译再执行、擅长数据计算和数据处理、开发......
  • 矩阵树定理学习笔记
    用来求和一个图的生成树个数相关的算法,时间复杂度\(O(n^3)\)。你要会求一个矩阵的行列式,这是和行列式有关的前置知识。定理阐述对于无向图定义度数矩阵\(D_{i,j}=[i=j]\deg_i\),其中\(\deg_i\)表示\(i\)的度数。定义邻接矩阵为\(E_{i,j}\)为边\((i,j)\)的个数。定......
  • OpenCV计算机视觉学习(16)——仿射变换学习笔记
    如果需要其他图像处理的文章及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice在计算机视觉和图像处理中,仿射变换是一种重要的几何变换方法。它可以通过线性变换和平移来改变图像的形状和位置,广泛应......
  • Java中跳转语句的学习
    跳转语句目录跳转语句break语句continue语句break语句break语句可用于上一节介绍的while、repeat-while和for循环结构,它的作用是强行退出循环体,不再执行循环体中剩余的语句。在循环体中使用break语句有两种方式:带有标签和不带标签。语法格式如下:break;//不带标签......
  • python中列表的学习
    列表目录列表列表的定义创建列表列表的索引列表的切片内置函数列表的遍历列表的常用方法(变量.方法名())列表的定义List(列表)是Python中使用最频繁的数据类型,在其他语言中通常叫做数组专门用于存储一串信息列表用[]定义,数据之间使用﹐分隔列表的索引从О开始索引就是数据在列......
  • 深度学习(VIT)
    将Transformer引入图像领域之作,学习一下。网络结构:VIT结构有几个关键的地方:1.图像分块:输入图像被划分为固定大小的非重叠小块(patches),每个小块被展平并线性嵌入到一个固定维度的向量中。这里是将32x32的图像划分成4x4的小块,总共会有16个小块,每个小块有64维向量。2.位置编码:......
  • Objective-C学习笔记(协议和代理)
    协议协议是多个类共享的一个方法列。协议中列出的方法没有相应的实现,计划由其他人来实现。可以定义这些方法为必须实现的,也可以为可选择实现的@protocal协议名//在此处添加必须实现的协议方法@optional//在此处添加可选择实现的协议方法@end遵循协议也符合继承关系......
  • 中级软件设计师---小白学习第一天:数据的表示和校验码
    计算机中只能识别的数据是二进制,低电平代表0,高电平代表1进制的符号表示:二进制B,十进制D,十六进制H真值:符合人类习惯的数字机器数:数字实际存到机器里面的形式,正负号需要被”数字化“15——1111+15——011118——1000-8——11000数据的表示:定点数与浮......