C: Linked List

发布时间 2023-11-13 19:26:10作者: ®Geovin Du Dream Park™

 

/**
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述: 嵌套结构体
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : CLion 2023.1.1 c17  windows 10
# Datetime  : 2023/11/13 17:35
# User      : geovindu
# Product   : CLion
# Project   : ctest
# File      : Family.c
# explain   : 学习
*/
//
// Created by geovindu on 2023/11/13.
//

#ifndef CTEST_FAMILY_H
#define CTEST_FAMILY_H

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

/**
 * @brief 日期
 */
typedef struct Date Date;

/**
 * @brief 家庭
 */
typedef struct Family Family;

/**
 * @brief
 *
 */
struct Date
{
    int day;//日
    int month;//月
    int year;//年
};

/**
 * @brief 家庭
 *
 */
struct Family
{
    Date dob; //日期
    char name[20];//姓名
    char father[20];//父亲
    char mother[20];//母亲
    Family *next;                        // Pointer to next structure
    Family *previous;                    // Pointer to previous structure
};


/**
 * @brief  获取输入的记录
 * @return
 */
Family *getPerson(void);

/**
 * @brief 遍历输出
 * @param forwards
 * @param pfirst
 * @param plast
 */
void showPeople(bool forwards, Family *pfirst, Family *plast);

/**
 * @brief 释放内存
 * @param pfirst
 */
void releaseMemory(Family *pfirst);

/**
 * 显示
 */
void displasyFamily();


#endif //CTEST_FAMILY_H

  

/**
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述: 嵌套结构体
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : CLion 2023.1.1 c17  windows 10
# Datetime  : 2023/11/13 17:35
# User      : geovindu
# Product   : CLion
# Project   : ctest
# File      : Family.c
# explain   : 学习
*/

//
// Created by geovindu on 2023/11/13.
//

#include "../includes/Family.h"



/**
 * @brief Function to input data on Family members
 * @return返回一个结构体 家庭记录
 */
Family *getPerson(void)
{
    struct Family *temp = (Family*) malloc(sizeof(Family));  // Define local pointer

    printf_s("\nEnter the name of the person: ");
    scanf_s("%s", temp->name, sizeof(temp->name));

    printf_s("\nEnter %s's date of birth (day month year); ", temp->name);
    scanf_s("%d %d %d", &temp->dob.day, &temp->dob.month, &temp->dob.year);

    printf_s("\nWho is %s's father? ", temp->name);
    scanf_s("%s", temp->father, sizeof(temp->father));

    printf_s("\nWho is %s's mother? ", temp->name);
    scanf_s("%s", temp->mother, sizeof(temp->mother));

    temp->next = temp->previous = NULL;    // Set pointer members to NULL

    return temp;                           // Return address of Family structure
}

/*********************************************************
 *@brief 遍历所有记录
 *
 * @param forwards
 * @param pfirst
 * @param plast
 *
 *********************************************************/
void showPeople(bool forwards, Family *pfirst, Family *plast)
{
    printf_s("\n");
    for(Family *pcurrent = forwards ? pfirst : plast ;
        pcurrent != NULL ; pcurrent = forwards ? pcurrent->next : pcurrent->previous)
    {
        printf_s("%s was born %d/%d/%d and has %s and %s as parents.\n",
                 pcurrent->name, pcurrent->dob.day, pcurrent->dob.month,
                 pcurrent->dob.year, pcurrent->father,  pcurrent->mother);
    }
}

/**
 * @brief 释放内存
 * @param pfirst
 */
void releaseMemory(Family *pfirst)
{
    Family *pcurrent = pfirst;
    Family *temp = NULL;
    while(pcurrent)
    {
        temp = pcurrent;
        pcurrent = pcurrent->next;
        free(temp);
    }
}

/**
 * 显示
 */
void displasyFamily()
{
    Family *first = NULL;                // Pointer to first person
    Family *current = NULL;              // Pointer to current person
    Family *last = NULL;                 // Pointer to previous person
    char more = '\0';                    // Test value for ending input

    while(true)
    {
        printf_s("\nDo you want to enter details of a%s person (Y or N)? ",
                 first != NULL ? "nother" : "");
        scanf_s(" %c", &more, sizeof(more));
        if(tolower(more) == 'n')
            break;

        current = getPerson();

        if(first == NULL)
            first = current;                // Set pointer to first Family
        else
        {
            last->next = current;   // Set next address for previous Family
            current->previous = last;   // Set previous address for current
        }
        last = current;                                        // Remember for next iteration
    }

    showPeople(true, first, last); // Tell them what we know
    releaseMemory(first);
    first = last = NULL;


}

  

调用:、

  displasyFamily();

  

输出: