第11章 结构化数据

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

#define _STDC_WANT_LIB_EXT1_ 1
#include 

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 
#include 

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 
#include 
#include 

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 
#include 
#include 

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",¤t->age);

        printf("How high is %s? ",current->name);
        scanf("%d",¤t->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 
#include 
#include 

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",¤t->age);

        printf("How high is %s? ",current->name);
        scanf("%d",¤t->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;
}

你可能感兴趣的:(C语言入门经典的基本程序)