美文网首页
C语言结构体和简单操作链表

C语言结构体和简单操作链表

作者: 酸菜牛肉 | 来源:发表于2016-12-20 20:44 被阅读372次
    结构体:
    • 1,基本定义:
    {
           //成员列表
    };
    

    成员列表:
    有基本数据类型定义的变量或者构造类型的变量
    example:

            struct student
            {
             int grade;
             int age;
             char name[32];   };
    
    `student`:结构体名称
    `struct student`:结构数据类型,相当于`int,double,char`等基本的数据类型。
    `struct student stu`;
    `stu`:结构体变量
    访问结构成员:“.”,`stu.age;stu.grade`;
    2,结构体变量的初始化
    

    struct student{
    char name[32];
    char sex;
    int age;
    };

    (1)初始化1
    

    struct student boy;
    strcpy(boy.name,"jack");
    boy.age = 24;
    boy.sex ='m';

    (2)初始化2
    `struct studetn gril = {"jack",24,'m'}`;
    和成员列表一一必须对应。。
    (3)定义的同时初始化(不建议)
    

    struct student{
    char name[32];
    char sex;
    int age;
    }stu = {"fuck",'W',24};

    * 嵌套定义结构体:
    

    struct student{
    int a;
    char b;
    struct student stu;
    };

    这种方法不可以。。
    

    struct student{
    int a;
    char b;
    struct student *ps;
    };

    指针大小的是固定的
    * 3 无名结构体
    

    struct{
    int age;
    char name[16];
    }stu;

    **结构体变量可以赋值给相同类型的变量**
    * 4 ,宏定义结构体名称
    `#define STU struct student`
    * 5,结构体的嵌套
    

    struct date{
    int year;
    int month;
    int day;
    };
    struct student{
    char name[32];
    int age;
    struct date birthday;
    };```

    • 6,结构体指针:
    struct student stu;
        struct student *p = &stu;
        strcpy(p->name,"hello");
        p->age = 13;
        p->birthday.year = 1990;
        p->birthday.month = 2;
        p->birthday.day = 13;
        printf("%s,%d,%d,%d,%d\n",p->name,p->age,p->birthday.year,p->birthday.month,p->birthday.day);
    

    malloc() //申请堆空间
    free() //释放空间
    //申请堆空间,大小为sizeof(struct student)
    pa = (struct date *)malloc(sizeof(struct date));
    free(pa);//申请释放的堆空间

    • 7,typedef
      重新命名
      typedef int I;
      即给int取别名为I;
      结构体的字符串代替;
    typedef struct student{
        int age;
        char name[32];
    }STU;
    /*
    struct student{
        int age;
        char name[32];
    };
    typedef struct student STU;*/
    

    和宏定义的区别
    typedef struct student* STT;
    #define STD struct student*
    STT stu1,stu2;//stu1 和stu2都是指针
    STD stu3,stu4;//stu3是指针,stu4不是指针
    define只是简单的字符串替换

    • 8,结构体的大小
      内存对齐
      Linux:4字节
      Windows:8字节
    struct student{   //默认从零开始
        char a;      //1  【0~8】
        long age;       //8  【9~16】
        char name[31]; //3   【17~48】
    };
    int main(){ 
        printf("%ld",sizeof(struct student));//48
        return 0;
    }```//最长字节数的倍数
    * 9 联合体
    union untype{
    int a;
    long b;
    };
    特点:每次只能操作一个成员变量。
    分配空间:按最大数据类型分配空间。
    * 11,枚举类型
      enum entype{
    A,//0
    B = 12,//12
    C//13
    };
    枚举类型中都是具体的数据,不能直接使用`.`的调用。。是一种数据类型,而不是构造类型
    * 12,链表
    链式存储结构,线性存储结构
    其大小可动态改变,链表是有一个个节点串起来的数据链
    **节点**:由数据域和指针域构成;
    数据域:存储数据;
    指针域:存放下一个节点的地址。
    (1)创建链表
    struct student{
    int id;
    struct student *next;
    };
    struct student *head;
    malloc();
    free()
    创建一个头节点:
    struct student *head;
    head = (struct student *)malloc(sizeof(struct student));
    头节点标识一个链表,即链表名称
    **头节点的数据域不存放数据,指针域存放第一个节点的地址**;
    #######总结:利用结构体产生链表,感觉程序员都好聪明。。。
    ####作业;
    操作头节点
    

    include<stdio.h>

    include<stdlib.h>

    typedef struct student{
    int ID;
    char name[32];
    struct student next;
    }STU,
    pSTU;
    //创建节点
    pSTU createNewNode(){
    pSTU newLink;
    newLink = (pSTU)malloc(sizeof(STU));
    newLink->next = NULL;
    return newLink;
    }
    //从头部添加节点
    pSTU addHeadLink(pSTU head){
    pSTU temp = createNewNode();
    printf("input ID:");
    scanf("%d",&temp->ID);
    printf("input name:");
    scanf("%s",temp->name);
    temp->next = head->next;
    head->next = temp;
    temp = NULL;
    return head;
    }
    //显示链表
    void showLink(pSTU head){
    pSTU p = head->next;
    printf("\tID\tname\n");
    while(p != NULL){
    printf("\t%d\t%s\n",p->ID,p->name);
    p = p->next;
    }
    return;
    }
    //从头节点删除
    pSTU deleteHeadLink(pSTU head){
    pSTU temp = head->next;
    head->next = temp->next;
    free(temp);
    temp = NULL;
    return head;
    }
    int main(int argc,char *argv[]){
    pSTU head = createNewNode();
    addHeadLink(head);
    showLink(head);
    deleteHeadLink(head);
    showLink(head);
    return 0;
    }

    操作尾节点
    

    include<stdio.h>

    include<stdlib.h>

    typedef struct student{
    int ID;
    char name[32];
    struct student next;
    }STU,
    pSTU;
    //创建一个新节点
    pSTU createNode(){
    pSTU link;
    link = (pSTU)malloc(sizeof(STU));
    link->next = NULL;
    return link;
    }
    //在尾部添加一个节点
    pSTU addTailNode(pSTU head){
    pSTU p = head;
    while(p->next != NULL)
    p = p->next;
    /*
    pSTU temp;
    temp = (pSTU)malloc(sizeof(STU));
    temp->next = NULL;
    */
    pSTU temp = createNode();
    printf("input ID:");
    scanf("%d",&temp->ID);
    printf("input name:");
    scanf("%s",temp->name);
    p->next = temp;
    temp = NULL;
    return head;
    }
    void showLink(pSTU head){
    pSTU p = head->next;
    printf("\tID\tname\n");
    while(p != NULL){
    printf("\t%d\t%s\n",p->ID,p->name);
    p = p->next;
    }
    }
    //尾删;
    pSTU deleteTailLink(pSTU head){
    pSTU p1 = head;
    pSTU p2 = head->next;
    while(p2->next != NULL){
    p2 = p2->next;
    p1 = p1->next;
    }
    p1->next = NULL;
    free(p2);
    p2 = NULL;
    return head;
    }
    int main(int argc,char *argv[]){
    pSTU head = createNode();
    int i = 0;
    for(i = 0;i < 4;i++){
    addTailNode(head);
    }
    showLink(head);
    for(i = 0;i<2;i++)
    deleteTailLink(head);
    showLink(head);
    return 0;
    }

    相关文章

      网友评论

          本文标题:C语言结构体和简单操作链表

          本文链接:https://www.haomeiwen.com/subject/gqpxvttx.html