zoukankan      html  css  js  c++  java
  • 链表功能函数总结

    链表功能函数总结

    最近在学习数据结构的内容,链表(LinkList)就是数据结构中最基本的一种数据类型,链表本身的构造特性也特别有意思,这里就构造了一个链表的功能函数,包含了链表的创建初始化、打印输出、计算长度、查找中间结点和清除链表等功能,在今后的学习中会不断扩充添加不同的功能!
    函数运行如下图所示:

    LinkList

    功能函数

    链表创建函数

    //声明链表创建函数(尾插法)
    void ListCreat(LinkList *L, int n)
    {
        LinkList *p, *r;
        int i;
        srand(time(0));
        p = L;
        for(i = 0; i < n; i++)
        {
            r = (LinkList *)malloc(sizeof(LinkList));
            p->data = rand() % 100 + 1;
            p->next = r;
            p = r;
        }
        p->next = NULL;
    }
    

    这里使用了尾插法对链表进行生成操作,使用rand()函数生成随机数对链表进行初始化。

    链表打印函数

    //打印链表函数
    ListPrint(LinkList *L)
    {
        LinkList *p;
        p = L;
        while(p->next != NULL)
        {
            printf("%d	", p->data);
            p = p->next;
        }
        printf("
    ");
    }
    

    通过判定p->next是否为NULL为条件对链表进行遍历打印。

    获取链表长度

    //声明一个函数,获取链表长度
    int ListLength(LinkList *L)
    {
        LinkList *p;
        p = L;
        int count = 0;
        while(p->next != NULL)
        {
            p = p->next;
            count++;
        }
        return count;
    }
    

    同上,通过判定p->next是否为NULL为条件对链表进行遍历计算链表的长度。

    获取中间结点

    //声明一个函数,获取链表中间结点
    int ListMid(LinkList *L)
    {
        LinkList *cur, *mid;
        cur = mid = L;
        while(cur->next != NULL)
        {
            if(cur->next->next != NULL)
            {
                mid = mid->next;
                cur = cur->next->next;
            }
            else
            {
                cur = cur->next;
            }
        }
        return mid->data;
    }
    

    设置cur的步长为2,mid的步长为1,同时对链表进行遍历,以cur == NULL为结束条件,可以以较高的效率得到链表的中间结点。

    链表清除

    //声明链表清理函数
    void ListClear(LinkList *L)
    {
        LinkList *p;
        p = L;
        while(L->next != NULL)
        {
            L = p->next;
            free(p);
            p = L;
        }
        free(L);
    }
    

    使用free()函数对我们生成的链表空间进行遍历删除。


    总体代码

    #include <stdio.h>
    #include <stdlib.h>
    //声明链表结构体
    typedef struct node
    {
        int data;
        struct node *next;
    }LinkList;
    //声明链表创建函数(尾插法)
    void ListCreat(LinkList *L, int n)
    {
        LinkList *p, *r;
        int i;
        srand(time(0));
        p = L;
        for(i = 0; i < n; i++)
        {
            r = (LinkList *)malloc(sizeof(LinkList));
            p->data = rand() % 100 + 1;
            p->next = r;
            p = r;
        }
        p->next = NULL;
    }
    //打印链表函数
    ListPrint(LinkList *L)
    {
        LinkList *p;
        p = L;
        while(p->next != NULL)
        {
            printf("%d	", p->data);
            p = p->next;
        }
        printf("
    ");
    }
    //声明一个函数,获取链表长度
    int ListLength(LinkList *L)
    {
        LinkList *p;
        p = L;
        int count = 0;
        while(p->next != NULL)
        {
            p = p->next;
            count++;
        }
        return count;
    }
    //声明一个函数,获取链表中间结点
    int ListMid(LinkList *L)
    {
        LinkList *cur, *mid;
        cur = mid = L;
        while(cur->next != NULL)
        {
            if(cur->next->next != NULL)
            {
                mid = mid->next;
                cur = cur->next->next;
            }
            else
            {
                cur = cur->next;
            }
        }
        return mid->data;
    }
    //声明链表清理函数
    void ListClear(LinkList *L)
    {
        LinkList *p;
        p = L;
        while(L->next != NULL)
        {
            L = p->next;
            free(p);
            p = L;
        }
        free(L);
    }
    //主函数
    int main()
    {
        printf("1.生成链表
    ");
        printf("2.打印链表
    ");
        printf("3.获取链表长度
    ");
        printf("4.获取中间结点
    ");
        printf("5.清楚链表
    ");
        printf("0.退出
    ");
        LinkList *L;
        L = (LinkList *)malloc(sizeof(LinkList));
        int length = 10;
        char operator;
        while(1)
        {
            scanf("%c", &operator);
            switch(operator)
            {
                case '1':
                    printf("**********生成链表***********
    ");
                    ListCreat(L, length);
                    break;
                case '2':
                    printf("**********打印链表**********
    ");
                    ListPrint(L);
                    break;
                case '3':
                    printf("********获取链表长度********
    ");
                    printf("The length of this ListCreat is: %d
    ", ListLength(L));
                    break;
                case '4':
                    printf("********获取中间结点********
    ");
                    printf("The value of the middle node is: %d
    ", ListMid(L));
                    break;
                case '5':
                    ListClear(L);
                    printf("**********清楚完毕**********
    ");
                    break;
                case '0':
                    printf("************退出************
    ");
                    return 0;
            }
        }
        return 0;
    }
    

    github Githubhttps://github.com/haoyuanliu
    个人博客 个人博客http://haoyuanliu.github.io/

    个人站点,欢迎访问,欢迎评论!

  • 相关阅读:
    9月22日 又上锁妖塔
    1396. 【2014年鄞州区】挖掘机(d.pas/c/cpp)
    栓奶牛——二分解法
    P6188 [NOI Online 入门组]文具订购 题解
    HDC.Cloud | 基于IoT Studio自助生成10万行代码的奥秘
    华为云API Explorer开发者生态平台正式上线
    【华为云技术分享】揭秘华为云DLI背后的核心计算引擎
    【华为云技术分享】ARM体系结构基础(2)
    【华为云技术分享】HDC.Cloud | 以数字资产模型为核心驱动的一站式IoT数据分析实践
    【华为云技术分享】数据赋能,如何精细化保障企业大数据安全
  • 原文地址:https://www.cnblogs.com/zuilehongdou/p/5483467.html
Copyright © 2011-2022 走看看