学习笔记第十六天

1.结构体

        1.1结构体的定义
        结构体(Struct)是C语言中一种重要的复合数据类型,允许将不同类型的数据项组合成一

个单一的类型。定义结构体使用struct关键字,其基本语法为:

struct Student

{

         成员列表;

};          //;不能省略;

        其中,结构体名是用户自定义的标识符,用于标识这个结构体类型;成员列表是结构体中包

含的一个或多个成员,每个成员可以是基本数据类型或另一个结构体类型。

        1.2结构体变量的声明和初始化
        结构体变量的声明方式:

#include<stdio.h>
#include<string.h>
struct Student
{
    int id;
    float score;
    char name[20];

};

int main(void)
{
    int i;
    struct Student s;    //struct Student s = {1,95.5,"zhangsan"};
    s.id = 1;//
    s.score = 95.5;//
    strcpy(s.name,"zhangsan");//
    printf("%d,%f,%s\n",s.id,s.score,s.name);

    return 0;
}

        1.3结构体成员的访问

        结构体成员的访问通常有两种方式:

        通过结构体变量和点运算符(.):

stu.age = 20;
printf("%d\n", stu.age);

        通过指向结构体变量的指针和箭头运算符(->):

struct Student *pstu = &stu;
pstu->age = 20;
printf("%d\n", pstu->age);


        1.4结构体对齐

        

        1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;

        2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必

须能够整除成员的字节数;

        3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;

        4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。

        1.5链表

        构建链表:链表是一种常见的数据结构,其节点通常使用结构体来定义,包含数据和指向下

一个节点的指针。

         示例代码,以下是一个使用结构体构建简单链表的示例代码:

#include<stdio.h>
#include<stdlib.h>
struct Node
{
    int a;
    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->a= n;
}
void printlist(struct Node *pHead)//打印链表
{
    struct Node *p = pHead->next;
    while(p!=NULL)
    {
        printf("%d,",p->a);
        p = p->next;
    }
    printf("\b \n");
}
int size(struct Node *pHead)//有效元素
{
    int i=0;
    struct Node *p = pHead->next;
    while(p!=NULL)
    {
        ++i;
        p = p->next;
    }
    return i;
}
int isEmpty(struct Node *pHead)//判断是否是空链表;
{
    if(pHead->next == NULL)
    {
        return 1;
    }
    return 0;
}

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

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值