zoukankan      html  css  js  c++  java
  • C语言的链表-第一部分

    这是有空头的链表

    #include"stdio.h"
    #include"stdlib.h"
    #include"windows.h"
    
    struct Node
    {
        int a;
        struct Node* pNEXT;
    };
    
    //链表头尾指针定义
    struct Node* g_pHead = NULL;
    struct Node* g_pEnd = NULL;
    
    
    //空头的初始化函数
    void List_Init_Head()
    {
        g_pHead = (struct Node*)malloc(sizeof(struct Node));
        g_pHead->pNEXT = NULL;
        g_pEnd = g_pHead;  //空头的初始化
    }
    
    //创建节点的函数
    struct Node* Create_Node(int N)
    {
        struct Node* pTemp = (struct Node*)malloc(sizeof(struct  Node));
        pTemp->a = N;
        pTemp->pNEXT = NULL;
        return pTemp;
    }
    
    
    //  尾添加
    void AddNodeToList_End(int N)
    {
        //创建一个节点
        struct Node* pTemp = Create_Node(N);
    
        //链接
            g_pEnd->pNEXT = pTemp;
            g_pEnd = pTemp;
    }
    
    
    // 头添加
    void AddNodeToList_Head(int N)
    {
        //创建一个节点
        struct Node* pTemp = Create_Node(N);
                
         pTemp->pNEXT =g_pHead->pNEXT ;
         g_pHead->pNEXT = pTemp;
        
    }
    
    //遍历链表
    void List_SeeAll(struct Node* TouPlace)  //TouPlace 为g_Head
    {
    
        if (TouPlace== NULL)
        {
            printf("链表为空");
            return;
        }
        struct Node* CANSHU = TouPlace->pNEXT;
        printf("当前的链表为
    ");
            while (CANSHU != NULL)
            {
                printf("%d
    ", CANSHU->a);
                CANSHU = CANSHU->pNEXT;
            }
    }
     
    
    //查找数据
    struct Node* List_Search(struct Node* TouPlace, int se)
    {
        struct Node* CANSHU = TouPlace->pNEXT;
        if (CANSHU == NULL)
        {
            exit(0);
            printf("当前链表为空
    ");
        }
        else
        {
            while (CANSHU != NULL)
            {
                if (CANSHU->a == se)
                {
                    return CANSHU;                //返回节点       
                }
                CANSHU = CANSHU->pNEXT;
            }
        }
        return NULL;                            //没找到,返回NULL
    }
    
    
    
    
    
    //指定特定(位置)内容的后一位插入节点
    void Add_List_Behind_Special(struct Node* TouPlace, int index, int N)
    {
        if (TouPlace->pNEXT == NULL)
        {
            printf("此链表为空
    ");
            return;
        }
        else
        {
            struct Node* pTemp = List_Search(TouPlace, index);
            if (pTemp == NULL)
            {
                printf("没有指定节点
    ");
                return;
            }
            else
            {
                struct Node* pNode = Create_Node(N);
                if (pTemp == g_pEnd)
                {
                    AddNodeToList_End(N);
                }
                else
                {
                    pNode->pNEXT = pTemp->pNEXT;
                    pTemp->pNEXT = pNode;
                }
                
            }
        }
    }
    
    //指定特定(位置)内容的前一位插入节点
    void Add_List_Front_Special(struct Node* TouPlace, int index, int N)
    {
        if (TouPlace->pNEXT == NULL)
        {
            printf("此链表为空
    ");
            return;
        }
        else
        {
            struct Node* pTemp = List_Search(TouPlace, index-1);
            if (pTemp == NULL)
            {
                printf("没有指定节点
    ");
                return;
            }
            else
            {
                struct Node* pNode = Create_Node(N);
    
                    pNode->pNEXT = pTemp->pNEXT;
                    pTemp->pNEXT = pNode;
            }
        }
    }
    
    //删除头
    void Delete_List_Head(struct Node* TouPlace) // TouPlace应为g_pHead
    {
        if (NULL == TouPlace->pNEXT)
        {
            printf("当前的链表为空
    ");
            return;
        }
        else
        {
            struct Node* pTemp = g_pHead->pNEXT;
            g_pHead->pNEXT = pTemp->pNEXT;
            free(pTemp);
        }
    }
    
    
    //删除尾
    void Delete_List_End(struct Node* TouPlace, struct Node* WeiPlace)//TouPlace应为g_pHead,WiePlace 是g_pEnd
    {
        if (NULL == TouPlace)
        {
            printf("当前的链表为空
    ");
            return;
        }
        else
        {
    
            if (TouPlace->pNEXT == WeiPlace)//只有一个
            {
                free(g_pEnd);
                g_pHead->pNEXT = NULL;
                g_pEnd=g_pHead;
            }
            else
            {
                //找到倒数第二个
                struct Node* pTemp = g_pHead->pNEXT;
                while (pTemp!=NULL)
                {
                    if (g_pEnd == pTemp->pNEXT)
                    {
                        break;
                    }
                    pTemp = pTemp->pNEXT;
                }
    
                //删除 
                free(g_pEnd);
                g_pEnd = pTemp; 
                g_pEnd->pNEXT = NULL;
            }
        }
    }
    
    
    //删除任意节点
    void Delete_List_Special(struct Node* TouPlace, struct Node* weiPlace, int index)//TouPlace应为g_pHead,WiePlace 是g_pEnd
    {
        if (NULL == (*TouPlace).pNEXT)
        {
            printf("当前的链表为空
    ");
            return;
        }
        else
        {
            struct Node* pTemp = List_Search(g_pHead, index);
            if (pTemp==NULL)
            {
                printf("查无此节点");
                return;
            }
            else
            {
                    if (pTemp == g_pEnd)
                    {
                        Delete_List_End(g_pHead, g_pEnd);
                    }
                    else
                    {
                        struct Node* pT = g_pHead;
                        while (pT != NULL)
                        {
                            if (pTemp == pT->pNEXT)
                            {
                                break;
                            }
                            pT = pT->pNEXT;
                        }
                        pT->pNEXT = pTemp->pNEXT;
                        free(pTemp);
                    }
            }
        }
    }
    
    
    //替换
    void List_Replace_Special(struct Node* TouPlace, int se, int Aim)
    {
        struct Node* UI = List_Search(TouPlace, se);
        if (UI == NULL)
        {
            printf("查找失败");
            exit(0);
        }
        else
        {
            UI->a = Aim;
        }
    }
    
    
    //清空链表
    void List_Free_All(struct Node* TouPlace)// TouPlace应为g_pHead
    {
        struct Node* pTemp = TouPlace->pNEXT;
        while (pTemp != NULL)
        {
            struct Node* pt = pTemp;            //构建中间参数
            pTemp = pTemp->pNEXT;                //先指向下一个,再释放
            free(pt);                            //释放内存
        }
        //清空链表头尾指针
        g_pHead = NULL;
        g_pEnd = NULL;
    }
    
    
    int main()
    {
        List_Init_Head();//空头初始化函数
    
        AddNodeToList_End(1);
        AddNodeToList_End(2);
        AddNodeToList_End(3);
        AddNodeToList_End(4);
        List_SeeAll(g_pHead);
        List_Replace_Special(g_pHead,3,45);
        List_SeeAll(g_pHead);
        return 0;
    }    
  • 相关阅读:
    手机号中间几位用****代替
    正则小数点保留后两位;只允许汉字字母1-20位;10位数纯数字;正整数
    正则1-30之间的数值,支持1位小数
    给ul => li 中的最后一个li不加伪类after; 或者给最后一个和第一个不加伪类
    ajax请求, 前后端, 代码示例
    最简单的操作 jetty IDEA 【debug】热加载
    maven win 安装 与 IntelliJ IDEA 配置Maven【2018-11-14最新最有姿势攻略】
    mysql 在 win 安装 最全攻略(附转载的乱码终极解决方案)以及解决data too long for column 'name' at row 1, 一种可能就是因为编码一致性问题.
    SpringBoot无法书写主启动类的情况之一
    扯淡设计模式2:java,模板模式,
  • 原文地址:https://www.cnblogs.com/Loving-Q/p/12629643.html
Copyright © 2011-2022 走看看