zoukankan      html  css  js  c++  java
  • C语言-指针

    目的:双向链表 -> 实现链表的添加和删除等操作

    编译环境:VS2013

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    
    
    typedef enum{
        FALSE = 0,
        TRUE = 1,
    }STATUS;
    
    // 1. 定义双向链表的基本结构
    typedef struct _DOUBLE_LINK_NODE
    {
        int data;
        struct _DOUBLE_LINK_NODE* prev;
        struct _DOUBLE_LINK_NODE* next;
    }DOUBLE_LINK_NODE, *DuLinkList;
    
    // 2. 创建双向链表节点
    DOUBLE_LINK_NODE* create_double_link_node(int value)
    {
        DOUBLE_LINK_NODE* pDLinkNode = NULL;
        pDLinkNode = (DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
        assert(NULL != pDLinkNode);
    
        memset(pDLinkNode, 0, sizeof(DOUBLE_LINK_NODE));
        pDLinkNode->data = value;
        return pDLinkNode;
    }
    
    // 3. 删除双向链表
    void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode)
    {
        DOUBLE_LINK_NODE* pNode;
        if (NULL == *pDLinkNode)
            return;
    
        pNode = *pDLinkNode;
        *pDLinkNode = pNode->next;
        free(pNode);
        delete_all_double_link_node(pDLinkNode);
    }
    
    // 4. 在双向链表中查找数据
    DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int data)
    {
        DOUBLE_LINK_NODE* pNode = NULL;
        if (NULL == pDLinkNode)
            return NULL;
    
        pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
        while (NULL != pNode){
            if (data == pNode->data)
                return pNode;
            pNode = pNode->next;
        }
    
        return NULL;
    }
    
    // 5. 双向链表中插入数据
    STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
    {
        DOUBLE_LINK_NODE* pNode;
        DOUBLE_LINK_NODE* pIndex;
    
        if (NULL == ppDLinkNode)
            return FALSE;
    
        if (NULL == *ppDLinkNode){
            pNode = create_double_link_node(data);
            assert(NULL != pNode);
            *ppDLinkNode = pNode;
            (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
            return TRUE;
        }
    
        if (NULL != find_data_in_double_link(*ppDLinkNode, data))
            return FALSE;
    
        pNode = create_double_link_node(data);
        assert(NULL != pNode);
    
        pIndex = *ppDLinkNode;
        while (NULL != pIndex->next)
            pIndex = pIndex->next;
    
        pNode->prev = pIndex;
        pNode->next = pIndex->next;
        pIndex->next = pNode;
        return TRUE;
    }
    
    // 6. 双向链表中删除数据
    STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
    {
        DOUBLE_LINK_NODE* pNode;
        if (NULL == ppDLinkNode || NULL == *ppDLinkNode)
            return FALSE;
    
        pNode = find_data_in_double_link(*ppDLinkNode, data);
        if (NULL == pNode)
            return FALSE;
    
        if (pNode == *ppDLinkNode){
            if (NULL == (*ppDLinkNode)->next){
                *ppDLinkNode = NULL;
            }
            else{
                *ppDLinkNode = pNode->next;
                (*ppDLinkNode)->prev = NULL;
            }
    
        }
        else{
            if (pNode->next)
                pNode->next->prev = pNode->prev;
            pNode->prev->next = pNode->next;
        }
    
        free(pNode);
        return TRUE;
    }
    
    // 7. 统计双向链表中数据的个数
    int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode)
    {
        int count = 0;
        DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
    
        while (NULL != pNode){
            count++;
            pNode = pNode->next;
        }
        return count;
    }
    
    // 8. 打印双向链表中数据
    void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)
    {
        DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
    
        while (NULL != pNode){
            printf("%d
    ", pNode->data);
            pNode = pNode->next;
        }
    }
    
    void main()
    {
        DOUBLE_LINK_NODE *datlinklist;
        datlinklist = create_double_link_node(22);
    
        printf("count = %d
    ", count_number_in_double_link(datlinklist));
        //count_number_in_double_link(datalinklist);
        printf("hello world!
    ");
        system("pause");
    }
  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/5775090.html
Copyright © 2011-2022 走看看