搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 朱先生和陈小姐的SMART日常 > c语言——链表和二叉树

c语言——链表和二叉树

朱先生和陈小姐的SMART日常 2020-06-28

本期提供了c语言链表和二叉树的基本程序,仅供参考。电脑上观感更佳。

教材中第9章,有非常全的伪代码与c语言间的转换,在此不再赘述。需要教材可以私聊我。




链表




链表程序举例

输入:无

输出:两个学生的名字和生日

子函数:displayList(递归或非递归)


#include <stdio.h>

#include <stdlib.h>

void displayList(struct MDate_naiss *ptr);

struct MDate_naiss

{

    int day, month, year;

    char name[40];

    struct MDate_naiss *next;

};


int main()

 //主函数

    struct MDate_naiss s1, s2;

    struct MDate_naiss *ptr;


    s1.year = 2001;

    s1.month = 8;

    s1.day = 8;

    s1.name[0] = 'T';

    s1.name[1] = 'o';

    s1.name[2] = 'm';

    s1.next = &s2;


    s2.year = 2001;

    s2.month = 2;

    s2.day = 2;

    s2.name[0] = 'J';

    s2.name[1] = 'e';

    s2.name[2] = 'r';

    s2.name[3] = 'r';

    s2.name[4] = 'y';

    s2.next = NULL;


    ptr = &s1;

    displayList(ptr);

    return 0;

}


void displayList(struct MDate_naiss *ptr)

{   //非递归

    int i;

    while (ptr != NULL)

    {

        i = 0;

        while ((*ptr).name[i] != '\0')

        {

            printf("%c", (*ptr).name[i]);

            i++;

        }

        printf("\n%d-%d-%d\n", (*ptr).day, (*ptr).month, (*ptr).year);

        ptr = (*ptr).next;

    }

}


void displayList(struct MDate_naiss *ptr)

{   //递归

    if (ptr != NULL)

    {

        int i = 0;

        while ((*ptr).name[i] != '\0')

        {

            printf("%c", (*ptr).name[i]);

            i++;

        }

        printf("\n%d-%d-%d\n", (*ptr).day, (*ptr).month, (*ptr).year);

        displayList((*ptr).next);

    }

}




二叉树



受到篇幅限制,二叉树的性质和更多用法在下期发布。


二叉树程序举例

输入:任意多的数

输出:建立二叉树,从小到大输出这些数,并输出树的深度

子函数:创造一个节点,插入一个节点,计算树的深度,用递归中序遍历


#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

struct Node

{

    int data;

    struct Node *pleft;

    struct Node *pright;

} Node;

struct Node *addnode(int value, struct Node *pnode);

struct Node *createnode(int value);

void listnodes(struct Node *pnode);

int Treeheight(struct Node *pnode);


int main()

 //主函数

    int newvalue = 0;

    struct Node *proot = NULL;

    char answer = 'n';

    do

    {

        printf("Enter the node value:\n");

        scanf("%d", &newvalue);

        if (proot == NULL)

            proot = createnode(newvalue);

        else

            addnode(newvalue, proot);

        printf("还要输入吗(y or n)?\n");

        scanf(" %c", &answer);

    } while (answer == 'y');

    listnodes(proot);

    printf("深度是%d!\n", Treeheight(proot));

    return 0;

}


struct Node *addnode(int value, struct Node *pnode)

{   //插入节点

    if (pnode == NULL)

        return createnode(value);

    if (value == pnode->data)

        return pnode;

    if (value < pnode->data)

    {

        if (pnode->pleft == NULL)

        {

            pnode->pleft = createnode(value);

            return pnode->pleft;

        }

        else

            return addnode(value, pnode->pleft);

    }

    else

    {

        if (pnode->pright == NULL)

        {

            pnode->pright = createnode(value);

            return pnode->pright;

        }

        else

            return addnode(value, pnode->pright);

    }

}


struct Node *createnode(int value)

 //创造一个节点

    struct Node *pnode = (struct Node*)malloc(sizeof(struct Node));

    pnode->data = value;

    pnode->pleft = pnode->pright = NULL;

    return pnode;

}


void listnodes(struct Node *pnode)

{   //用递归中序遍历

    if (pnode != NULL)

    {

        listnodes(pnode->pleft);

        printf("%d\n", pnode->data);

        listnodes(pnode->pright);

    }

}


int Treeheight(struct Node *pnode)

{   //用递归计算树的深度

    int LD, RD;

    if (pnode == NULL)

        return 0;

    else

    {

        LD = Treeheight(pnode->pleft);

        RD = Treeheight(pnode->pright);

        return (LD >= RD? LD:RD)+1;

    }

}



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《c语言——链表和二叉树》的版权归原作者「朱先生和陈小姐的SMART日常」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注朱先生和陈小姐的SMART日常微信公众号

朱先生和陈小姐的SMART日常微信公众号:Charles_Isoline

朱先生和陈小姐的SMART日常

手机扫描上方二维码即可关注朱先生和陈小姐的SMART日常微信公众号

朱先生和陈小姐的SMART日常最新文章

精品公众号随机推荐