malloc一个动态链表

描述:按图实现一个人员管理功能(录入,增加,删除)

思考:是否可以将 动态链表的实现,封装成一套宏接口?(实现后更新)

代码实现:

1. 变量声明 和 main函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int listCount = 0; /* 个数统计 */
typedef struct _Student
{
    char name[20];
    int  number;

    struct _Student *pNext;
}STUDENT;

void Print_Student_Info(STUDENT *pList)
{
    STUDENT *pNewNode = NULL;

    unsigned int index = 0;

    if (NULL == pList ||
        NULL == pList->pNext)
    {
        printf("\n---- student info is not exist ----\n\n");
        return ;
    }

    printf("\n---- the list has %d members ----\n\n", listCount);
    
    index = 1;
    pNewNode = pList->pNext;
    while (NULL != pNewNode)
    {
        printf("the NO%02d member is:\n", index);
        printf("    the name is %s\n", pNewNode->name);
        printf("    the number is %d\n\n", pNewNode->number);

        index++;
        pNewNode = pNewNode->pNext;
    }
    
    return ;
}

int main(int argc, char *argv[])
{
    STUDENT *pStudentlist = NULL;

    /* 创建动态链表 */
    pStudentlist = Create_Student_Info();
    Print_Student_Info(pStudentlist);
    if (NULL == pStudentlist)
    {
        return 0;
    }

    /* 链表头部 插入一个学生信息 */
    Insert_Head_Student_Info(pStudentlist);
    Print_Student_Info(pStudentlist);

    /* 链表尾部 插入一个学生信息 */
    Insert_End_Student_Info(pStudentlist);
    Print_Student_Info(pStudentlist);

    /* 删除 一个学生信息 */
    Delete_Student_Info(pStudentlist);
    Print_Student_Info(pStudentlist);
    return 0;
}

2. 录入数据功能:

 

实现:(退出时会创建一个结点,需要free,否则会造成内存泄漏

STUDENT *Create_Student_Info()
{
    STUDENT *pHeadNode = NULL;
    STUDENT *pEndNode  = NULL;
    STUDENT *pNewNode  = NULL; 

    /* 初始化头结点  */
    printf("please enter [Name Number]:\n");
    pNewNode = (STUDENT *)malloc(sizeof(STUDENT));
    if (NULL == pNewNode)
    {
        printf("init head node failed!\n");
        return NULL;
    }
    memset(pNewNode, 0, sizeof(STUDENT));

    listCount = 0;
    pHeadNode = pNewNode;
    pEndNode  = pNewNode;

    do{
        /* 创建学生节点 */
        pNewNode = (STUDENT *)malloc(sizeof(STUDENT));
        if (NULL == pNewNode)
        {
            printf("create %d-th node failed!\n", (listCount+1));
            return pHeadNode;
        }
        scanf("%s", &pNewNode->name[0]);
        scanf("%d", &pNewNode->number);
        pNewNode->pNext = NULL;

        if (0 != pNewNode->number)
        {
            listCount++;
            pEndNode->pNext = pNewNode;
            pEndNode        = pNewNode;
        }

    }while (0 != pNewNode->number);
    
    /* 释放 最后申请的 number = 0的节点空间 */
    free((void*)pNewNode);

    return pHeadNode;
}

3. 插入数据功能

3.1 头插:

实现:

void Insert_Head_Student_Info(STUDENT *pList)
{
    STUDENT *pNewNode = NULL;

    if (NULL == pList)
    {
        printf("\n---- student is not exist, insert head failed! ----\n\n");
        return ;
    }

    printf("insert member at head:\n");
    pNewNode = (STUDENT *)malloc(sizeof(STUDENT));
    if (NULL == pNewNode)
    {
        printf("\ncreate insert node at head failed!\n");
        return ;
    }
    scanf("%s", &pNewNode->name[0]);
    scanf("%d", &pNewNode->number);
    pNewNode->pNext = NULL;

    /* 插入 头结点之后 */
    listCount++;
    pNewNode->pNext = pList->pNext;
    pList->pNext    = pNewNode;

    return ;
}

3.2 尾插:

 实现:

void Insert_End_Student_Info(STUDENT *pList)
{
    STUDENT *pEndNode = NULL;
    STUDENT *pNewNode = NULL;

    if (NULL == pList)
    {
        printf("\ninsert member node at end failed!\n");
        return ;
    }

    pEndNode = pList;
    while(NULL != pEndNode->pNext)
    {
        pEndNode = pEndNode->pNext;
    }

    printf("insert member at end:\n");
    pNewNode = (STUDENT *)malloc(sizeof(STUDENT));
    if (NULL == pNewNode)
    {
        printf("\ncreate insert node at end failed!\n");
        return ;
    }
    scanf("%s", &pNewNode->name[0]);
    scanf("%d", &pNewNode->number);
    pNewNode->pNext = NULL;
    
    /* 插入 尾节点之后 */
    listCount++;
    pEndNode->pNext = pNewNode;

    return ;
}

4. 删除数据功能:

实现:

void Delete_Student_Info(STUDENT *pList)
{
    STUDENT *pPerNode = NULL;
    STUDENT *pCurNode = NULL;

    char deleteName[20];

    if (NULL == pList ||
        NULL == pList->pNext)
    {
        printf("\n---- student info is not exist ----\n\n");
        return ;
    }

    printf("delete, please input student name:");
    scanf("%s", &deleteName[0]);

    pPerNode = pList;
    pCurNode = pList->pNext;
    while (NULL != pCurNode)
    {
        if (0 == strcmp(pCurNode->name, deleteName))
        {
            break;
        }

        pPerNode = pCurNode;
        pCurNode = pCurNode->pNext;
    }
    
    if (NULL != pCurNode)
    {
        printf("%s student delete success\n", deleteName);
        pPerNode->pNext = pCurNode->pNext;
        free(pCurNode);
        listCount--;
    }
    else
    {
        printf("%s student not exist!\n", deleteName);
    }

    return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值