首页 > 其他分享 >C语言之结构体—下

C语言之结构体—下

时间:2023-11-24 14:32:52浏览次数:28  
标签:struct int u1 C语言 printf next data 结构

单链表示例

案例1:创建并访问一个带头结点的、存储整型数据的单链表,数据从键盘输入,0为输入结束标志。

#include <stdio.h>
#include <stdlib.h>
struct linkRec{
    int data;
    struct linkRec *next;
};
int main()
{
    int x;
    struct linkRec *head,*p,*rear;
    head = rear = (struct linkRec *)malloc(sizeof(struct linkRec)); //创建空链表
    //创建链表的其它结点
    while(1){
        scanf("%d",&x);
        if(x==0) break;
        p=(struct linkRec *)malloc(sizeof(struct linkRec)); //申请一个新结点
        p->data=x; 
        rear->next=p;
        rear=p;
    }
    rear->next=NULL;
    //读链表
    printf("链表的内容为:\n");
    p=head->next;
    while(p!=NULL){
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
    return(0);
}

C语言之结构体—下_#include

案例2:约瑟夫环问题。

#include <stdio.h>
#include <stdlib.h>
struct node{
    int data;
    struct node *next;
};
typedef struct node NODE;
int main()
{
    NODE *head,*p,*q;
    int n,i;
    printf("Please input n:");
    scanf("%d",&n);
    //建立链表
    head = p=(NODE *)malloc(sizeof(NODE));
    p->data=0;
    for(i=1;i<n;i++){
        q=(NODE *)malloc(sizeof(NODE));
        q->data=i;
        p->next=q;
        p=q;
    }
    p->next=head;
    //删除过程
    q=head;
    while(q->next!=q){
        p=q->next;
        q=p->next;
        p->next = q->next;
        printf("%d\t",q->data);
        free(q);
        q=p->next;
    }
    //打印结果
    printf("\n最后剩下:%d\n",q->data);
    return(0);
}

C语言之结构体—下_链表_02

共用体
共用体的概念

C语言中有一个看上去与结构体非常类似的类型,称为共用体或联合体。

定义共用体类型时,用关键字union代替关键字struct,如下所示:

struct CharAndInt{
  int data;
  char s[4];
};
//----------***----------
union CharOInt{
  int data;
  char s[4];
};

两者看上去很类似,但本质完全不同。

结构体表示该类型的变量由一组分量组成,每个结构体类型的变量包含所有的分量。

共用体表示所有分量共享同一块空间。

案例:测试CharAndInt和CharOrInt占用的空间量。

#include <stdio.h>
#include <stdlib.h>

struct CharAndInt{
    int data;
    char s[5];
};
union CharOrInt{
    int data;
    char s[5];
};
int main()
{
    printf("CharAndInt占用%d个字节\n",sizeof(struct CharAndInt));
    printf("CharOrInt占用%d个字节\n",sizeof(union CharOrInt));
    return(0);
}

C语言之结构体—下_链表_03

数据怎么来的呢?

CharAndInt:结构体CharAndInt中包含一个int类型的数据和一个长度为5的char类型的数组,因此它的大小为 4+5=9个字节。但是由于内存对齐的原因,编译器会在结构体中添加一些填充字节,以保证结构体中每个成员的地址都是对齐的。在这个例子中,int类型的数据需要4个字节,而char类型的数组需要1个字节,因此编译器会在char类型的数组后面添加3个填充字节,使得结构体的大小为 12个字节。

1+3=4

4+5+3=12

5+3=8

共用体类型变量的定义及初始化
union CharOrInt u1,u2,*p;

C语言规定,初值的类型必须是第一个成员的类型。如:

union CharOrInt u1={97},u2={98};
共用体变量的使用

共用体变量的使用就是引用它的分量,引用方法与结构体类型的变量相同,也是用点运算符。如:

u1.data=100;
u2.data='a';

共用体也可以用指针访问,用“->”运算符。

共用体变量的基本操作

案例1:定义一个共用体类型CharOrInt及一个该类型的变量。输出该变量的占用的空间,检查变量及各分量的地址及值,以及测试共用体作为函数的参数。

#include <stdio.h>
#include <string.h>

union CharOrInt{
    int data;
    char s[4];
};
int f(union CharOrInt u){
    return u.data;
}
int main()
{
    union CharOrInt u1={97},*u2=&u1;
    printf("CharOrInt占用的空间是%d个字节\n",sizeof(u1));
    printf("u1地址是%d,u1.data地址是%d,u1.data地址是%d\t",&u1,&u1.data,u1.s);
    printf("\n%d\n",u2->data);
    printf("\n%d\n",f(u1));
    strcpy(u1.s,"abc");
    printf("\n%s\n",u2->s);
    return(0);
}

C语言之结构体—下_共用体_04

案例2:设计一个程序管理教工和学生的信息。

教工信息包括:工号,姓名,职业,部门。

学生信息包括:学号,姓名,类别,班级。

需要把教工和学生信息放入同一张表中。

信息表如下所示:

C语言之结构体—下_#include_05

学校成员信息表

如何将它们合二为一?共用体提供了一个很好的解决方案,可以将这两个信息组成一个共用体。程序实现如下所示:

#include <stdio.h>
#define MAX 10

int main()
{
    struct People{
        int no;
        char name[10];
        char type;
        union Position{
            int Class;
            char dept[10];
        }position;
    }people[MAX];
    int i;
    for(i=0;i<MAX;i++){
        printf("请输入%d个人的工号/学号:",i+1);
        scanf("%d",&people[i].no);
        getchar();
        printf("请输入%d个人的姓名:",i+1);
        gets(people[i].name);
        printf("请输入%d个人的类型:",i+1);
        people[i].type=getchar();
        getchar();
        switch(people[i].type){
            case 'T':
            case 'A':
            case 'S':
            printf("请输入%d个人的部门:",i+1);
            gets(people[i].position.dept);
            break;
            default:
			printf("请输入%d个人的班级:",i+1);
            scanf("%d",&people[i].position.Class);
        }
    }
    printf("学号/工号   姓名       类别   班级/部门\n");
    for(i=0;i<MAX;i++){
        printf("%-11d%-14s%",people[i].no,people[i].name);
        switch(people[i].type){
            case 'T': printf("%-10s","教师"); break;
            case 'A': printf("%-10s","机关人员"); break;
            case 'S': printf("%-10s","后勤人员"); break;
            case 'P': printf("%-10s","博士生"); break;
            case 'G': printf("%-10s","硕士生"); break;
            default: printf("%-10s","本科生");
        }
        switch(people[i].type){
            case 'T':
            case 'S':
            printf("%-10s\n",people[i].position.dept);
            break;
            default:
            printf("%-10d\n",people[i].position.Class);
        }
    }
    return(0);
}

程序的某次执行的结果为:

C语言之结构体—下_#include_06

案例3:测试整型数每个字节的值。

#include <stdio.h>
 
int main()
{
    union CharOrInt{
        int data;
        unsigned char s[4];
    };
    union CharOrInt u1={65535}, u2={131071};
    printf("%x  %x  %x  %x\n",u1.s[3],u1.s[2],u1.s[1],u1.s[0]);
    printf("%x  %x  %x  %x\n",u2.s[3],u2.s[2],u2.s[1],u2.s[0]);
    return(0);
}

C语言之结构体—下_#include_07

结构体中关于共用体的知识点总结到此就结束了,希望我的文章对你有帮助!

标签:struct,int,u1,C语言,printf,next,data,结构
From: https://blog.51cto.com/u_16174658/8549947

相关文章

  • hutool 使用 TreeUtil 查询树型结构
    之前写过一篇用stream流实现查询树型结构的文章,现在以hutool中的TreeUtil再来实现一次,之前的帖子JavaStream流实现递归查询树型结构查询出所有数据,用父节点递归查询出所有子节点数据/***封装备注分类集合**@paramremarkTypeList备注分类集合*......
  • 工作流引擎的主要表结构及其作用如下,下面以驰骋工作流引擎为例来说明。
     1.WF_GenerWorkFlow:该表主要用于存储流程引擎级别的数据,发起人,发起日期,workid,流程状态,流程标题,运行到的节点。2.WF_GenerWorkerList::这个表主要用于保存工作人员数据,执行人、执行节点、工作ID,是否读取,是否通过IsPass,.3.NDxxRpt*:业务数据表,表单采集的业务数据。。4.Port_*......
  • TableStructureRec: 表格结构识别推理库来了
    引言TableStructureRec仓库是用来对文档中表格做结构化识别的推理库,包括来自PaddleOCR的表格结构识别算法模型、来自阿里读光有线和无线表格识别算法模型等。该仓库将表格识别前后处理做了完善,并结合OCR,保证表格识别部分可直接使用。该仓库会持续关注表格识别这一领域,集成......
  • P5143 攀爬者(结构体+sort排序)
    P5143攀爬者sort排序:对于数组而言sort(数组+begin,数组+stop)(左闭右开)例:sort(a+1,a+n+1)=sort(a[1]~a[n])对于结构体在数组基础上多一个cmp运用:sort(数组+begin,数组+stop,cmp)cmp本身需要定义一个函数来表示比较。#include<iostream>#include<string>#include<ma......
  • 【数据结构】lxl 的 DS 修炼
    线段树&平衡树用线段树/平衡树维护的序列问题可以分为两类:1.静态型:维护一个类似于\(\sum_{l,r}....\)的值,或者是多次询问区间或全局的一些特征值。2.动态型:支持动态修改和动态询问区间信息的类型。对于静态型,我们通常首先思考怎样求单个区间的答案值,同理,动态型通常先考虑......
  • C语言【预处理器】
    C语言【预处理器】1、一些关于预处理的知识​ C代码中,一般带#的都是预处理指令,包括宏替换、文件包含、条件编译等。​ 为兼容一些老编译器,#前后一般不写空格​ 预处理指令后面不加分号。2、宏定义//格式如下#define宏名称(替换文本) //这个替换文本记得加上括号......
  • 构建树结构(节点级别,全路径)
    packageorg.example.tree;importorg.springframework.util.CollectionUtils;importjava.util.*;/***@ClassNameTreeUtils2*@DescriptionTODO*@Authorhrp*@Date2023/11/2314:39*/publicclassTreeUtils<NextendsTreeNode<T,RC,LC>,......
  • 秦疆的Java课程笔记:37 流程控制 switch选择结构
    多选择结构还有一个实现方式就是switchcase语句。switchcase语句判断一个变量与一系列值中某个值是否相等,每个值为一个分支。if判断区间,switch匹配一个具体的值。语法:switch(expression){ casevalue: //语句 break;//可选 casevalue: //语句 break;//可选 ......
  • 秦疆的Java课程笔记:36 流程控制 if选择结构
    if单选择结构很多时候需要去判断一个东西是否可行,然后才去执行这丫那个一个过程在程序中用if语句来表示。语法:if(布尔表达式){ //如果布尔表达式为true将执行语句}importjava.util.Scanner;publicclassIfDemo1{publicstaticvoidmain(String[]args){......
  • 秦疆的Java课程笔记:35 流程控制 顺序结构
    Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。顺序结构是最简单的算法结构。publicclassShunXuDemo{publicstaticvoidmain(String[]args){System.out.println("hello1");System.out.println("hello2");......