第11章 结构化数据

使用结构
尝试将horse结构用于一个简单的例子中

#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>

typedef struct Horse Horse;

struct Horse
{
    int age;
    int height;
    char father[20];
    char mother[20];
    char name[20];
};
int main()
{
    Horse my_horse;

    printf("Enter the name of the horse: ");
    scanf("%s",my_horse.name,sizeof(my_horse.name));

    printf_s("How old is %s? ",my_horse.name);
    scanf("%d", &my_horse.age);

    printf("How high is %s (in hands)? ",my_horse.name);
    scanf("%d",&my_horse.height);

    printf("Who is %s's father? ",my_horse.name);
    scanf("%s",&my_horse.father,sizeof(my_horse.father));

    printf("Who is %s's mother? ",my_horse.name);
    scanf("%s",&my_horse.mother,sizeof(my_horse.mother));

    printf(" %s id %d years olds ,%d hands high,",my_horse.name,my_horse.age,my_horse.height);

    printf(" and has %s and %s as parents.\n",my_horse.father,my_horse.mother);

    return 0;
}

使用结构数组
扩展上一个例子,以处理多匹马

#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>
#include <ctype.h>

typedef struct Horse Horse;

struct Horse
{
    int age;
    int height;
    char name[20];
    char father[20];
    char mother[20];
};

int main()
{
    Horse my_horses[50];
    int hcount = 0;
    char test = '\0';

    for (hcount = 0; hcount < sizeof(my_horses) / sizeof(Horse); ++hcount)
    {
        printf("Do you want to enter details of %s horse (Y or N)? ", hcount ? "nother" :"");

        scanf(" %c",&test,sizeof(test));
        if (tolower(test) == 'n')
            break;

        printf("Enter the name of the horse: ");
        scanf("%s",my_horses[hcount].name,sizeof(my_horses[hcount].name));

        printf("How old is %s? ",my_horses[hcount].name);
        scanf("%s",&my_horses[hcount].age,sizeof(my_horses[hcount].age));

        printf("How high is %s(in hands)? ",my_horses[hcount].name);
        scanf("%d", &my_horses[hcount].height, sizeof(my_horses[hcount].height));

        printf("Who is %s's father?", my_horses[hcount].name);
        scanf("%s",&my_horses[hcount].father,sizeof(my_horses[hcount].father));

        printf("Who is %s's mother?",my_horses[hcount].name);
        scanf("%s", &my_horses[hcount].mother, sizeof(my_horses[hcount].mother));
    }

    printf("\n");
    for (int i = 0; i < hcount; ++i)
    {
        printf("%s is %d years old,%d hands high,",my_horses[hcount].name,my_horses[hcount].age,my_horses[hcount].height);
        printf(" and has %s and %s as parents.\n",my_horses[hcount].father,my_horses[hcount].mother);
    }
    return 0;
}

使用结构指针
这个例子演示了如何为结构动态分配内存

#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct Horse Horse;

struct Horse
{
    int age;
    int height;
    char name[20];
    char father[20];
    char mother[20];
};

int main(void)
{
    Horse *phorses[50];
    int hcount =0;
    char test = '\0';
    for (hcount = 0; hcount < sizeof(phorses) / sizeof(Horse*); ++hcount)
    {
        printf_s("Do you want to enter details of a%s horse(Y or N)? ", hcount ? "nother" : "");
        scanf("%c", &test, sizeof(test));

        if (tolower(test) == 'n')
            break;

        phorses[hcount] = (Horse*)malloc(sizeof(Horse));

        printf("Enter the name of the horse: ");
        scanf("%s",phorses[hcount]->name,sizeof(phorses[hcount]->name));

        printf("How high is %s (in hands)? ",phorses[hcount]->name);
        scanf("%s",&phorses[hcount]->height);

        printf("How old is %s? ",phorses[hcount]->name);
        scanf("%d",&phorses[hcount]->age);

        printf("Who is %s's father?",phorses[hcount]->name);
        scanf("%s",phorses[hcount]->father,sizeof(phorses[hcount]->father));

        printf("Who is %s's mother? ",phorses[hcount]->name);
        scanf("%s",phorses[hcount]->mother,sizeof(phorses[hcount]->mother));
    }

    printf("\n");
    for (int i = 0; i < hcount; ++i)
    {
        printf("%s is %d years old,%d hands high,",phorses[i]->name,phorses[i]->age,phorses[i]->height);
        printf(" and has %s and %d as parents.\n",phorses[i]->father,phorses[i]->mother);

        free(phorses[i]);
    }
    return 0;
}

将结构指针用做结构成员
让结构含有指向同类型结构的指针

#define _STDC_WANT_LIB_EXT1_1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct Horse Horse;

struct Horse
{
    int age;
    int height;
    char name[20];
    char father[20];
    char mother[20];
    Horse *next;
};

int main()
{
    Horse *first = NULL;
    Horse *current = NULL;
    Horse *previous = NULL;

    char test = '\0';

    for (; ;)
    {
        printf("Do you want to enter details of a%s horse(Y or N)? ",first != NULL? "nother" : "");
        scanf(" %c",&test,sizeof(test));

        if (tolower(test) == 0)
            break;

        current = (Horse*)malloc(sizeof(Horse));
        if (first == NULL)
            first = current;

        if (previous != NULL)
            previous->next = current;

        printf("Enter the name of the horse: ");
        scanf("%s", current->name, sizeof(current->name));

        printf("How old is %s? ",current->name);
        scanf("%d",&current->age);

        printf("How high is %s? ",current->name);
        scanf("%d",&current->height);

        printf("Who is %s's father? ", current->name);
        scanf("%s",current->father,sizeof(current->father));

        printf("Who is %s's mother? ", current->name);
        scanf("%s",current->mother,sizeof(current->mother));

        current->next = NULL;
        previous = current;
    }

    printf("\n");
    current = first;
    while (current != NULL)
    {
        printf("%s is %d year old,%d hands high,",current->name,current->age,current->height);
        printf(" and has %s and %s as parents.\n",current->father,current->mother);
        previous = current;
        current = current->next;
        free(previous);
        previous = NULL;
    }
    first = NULL;
    return 0;
}

双向链表

#define _STDC_WANT_LIB_EXT1_ 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct Horse Horse;

struct Horse
{
    int age;
    int height;
    char name[20];
    char father[20];
    char mother[20];
    Horse *next;
    Horse *previous;
};

int main()
{
    Horse *first = NULL;
    Horse *current = NULL;
    Horse *last = NULL;

    char test = '\0';

    for (; ;)
    {
        printf("Do you want to enter details of a%s horse(Y or N)? ", first != NULL? "nother" : "");

        scanf(" %c",&test,sizeof(test));

        if (tolower(test) == 'n')
            break;

        current = (Horse*)malloc(sizeof(Horse));
        if (first == NULL)
        {
            first = current;
            current-> previous = NULL;
        }
        else
        {
            last->next = current;
            current->previous = last;
        }
        printf("Enter the name of the horse: ");
        scanf("%s",current->name,sizeof(current->name));

        printf("How old is %s? ",current->name);
        scanf("%d",&current->age);

        printf("How high is %s? ",current->name);
        scanf("%d",&current->height);

        printf("Who is %s's mother? ",current->name);
        scanf("%s",current->mother,sizeof(current->mother));

        printf("Who is %s's father? ",current->name);
        scanf("%s",current->father,sizeof(current->father));

        current->next = NULL;
        last = current;

    }
    printf("\n");
    while (current != NULL)
    {
        printf("%s is %d years old,%d hands high, ",current->name,current->age,current->height);
        printf(" and has %s and %s as parents.\n", current->father, current->mother);
        last = current;
        current = current -> previous;
        free(last);
        last = NULL;

    }

    first = NULL;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值