链表-----待整理

//参考:  http://blog.csdn.net/feixiaoxing/article/details/6849457
#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, *PDoubleLinkNode;

// 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\n", pNode->data);
        pNode = pNode->next;
    }
}

int main()
{
    PDoubleLinkNode Glist;

    Glist = create_double_link_node(66);
    printf("insert = %d\n",insert_data_into_double_link(&Glist,77));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,88));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,99));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,55));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,44));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,77));
    printf("insert = %d\n",insert_data_into_double_link(&Glist,33));
    printf("len = %d\n",count_number_in_double_link(Glist));
    print_double_link_node(Glist);
    //printf("count = %d\n", insert_data_into_double_link(*datlinklist, 33));
    //printf("count = %d\n", count_number_in_double_link(datlinklist));
    //count_number_in_double_link(datalinklist);
    //printf("hello world!\n");
    return 0;
}
时间: 2024-10-02 23:48:41

链表-----待整理的相关文章

【数据结构】 链表知识点整理

首先是链表的定义: typedef struct NODE{ struct NODE *next; int value; }Node,*Linklist; 其中 Linklist为指向Node的指针: 接下来是几个常用的函数: 一.链表的初始化: int Linklist_init(Linklist *L){ *L = (Linklist)malloc(sizeof(Node)); if(!(*L)) { printf("创建失败"); return FALSE; } (*L)->

链表 知识点整理

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1). 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理.但是链表失去了

287. 寻找重复数

题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [1,3,4,2,2] 输出: 2 示例 2: 输入: [3,1,3,4,2] 输出: 3 说明: 不能更改原数组(假设数组是只读的). 只能使用额外的 O(1) 的空间. 时间复杂度小于 O(n2) . 数组中只有一个重复的数字,但它可能不止重复出现一次. 题意 审题可以发现两个关键点: num

链表的相关知识整理

链表的相关知识整理 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 链表与数组的区别 回忆下数组的概念 ,所谓数组,是相同数据类型的元素按一定顺序排列的集合.根据概念我们可以知道数组在内存中连续,链表不连续:由于不同的存储方式导致数组静态分配内存,链表动态分配内存,数组

整理剑指offer&mdash;链表操作

在链表中找到第一个含有某值的节点并删除该节点. 在这里我创建的链表里,头节点是不包含有效数据的,它只是起一个辅助作用,真正的链表数据从首节点开始. typedef struct Node{    int data; //数据域    struct Node * pNext; //指针域}NODE, *PNODE; 1: void RemoveNode(PNODE pHead, int val) 2: { 3: if(pHead == NULL || pHead->pNext == NULL) 4

数据结构代码整理——链表

/* c2-1.h 线性表的动态分配顺序存储结构 */ #define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 typedef struct { ElemType *elem; int length; int listsize; }SqList; /* c2-2.h 线性表的单链表存储结构 */ struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode *Link

韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/链表——最灵活的数据结构链表用来解决复杂的问题和算法是很方便的. 内容介绍1.什么是链表2.单向链表3.双向链表4.环形链表5.使用环形链表解决约瑟夫问题 链表——什么是链表链表是有序的列表,但是它在内存中是分散存储的. 链表无处不在,比如在操作系统中,文件和文件之间,文件块和文件块之间,是靠链表链接起来的.使用链表可以解决类似约瑟夫问题,排序,索引,二叉树,广义表... 链表——单链表的快速入门使用head头的单向链表

寒假 9(max subsequence sum二分递归算法实现并debug,表的链表实现概念过程整理)

二分递归实现过程收获: 一个取max的函数,核心是我brute的排序函数: 递归啊,如果结果出错,检查的时候查具体步骤,递归这个指令没什么好检查的: 遍布每个得出结果的关键点的输出测试: 因为一开始把right设成了array length,后面出现了str[length],有随机错误: 声明为int的小数,编译器直接不足近似处理为整数. 某处加一个break point,左边就可以看运行信息 表的链表实现概念梳理: 用链表实现的表,没有固定的位置编号,仅可以从value上识别,寻找,一个ele

关于相交链表、带环链表、链表深拷贝的思路整理

返回相交链表的交点:1.先求出两个链表的各自长度2.让长的先走他们的(长度差)步3.然后两者同时走,第一次相遇就是交点(返回该结点) 判断链表是否带环:1.快慢指针(快的走两步,慢的走一步,不能一个一步,一个n步(N>2),可能会错过)2.如果两个指针相遇,则链表带环:如果快的遇到null,则不带环(直线形) 求入环点:1).转化为相交问题(求取相遇结点)2).一个从起点,一个从交点,都每次走一步,第一次相遇点为入环点 相交+带环(六种情况) 复杂链表的复制1)简单复制无法解决(因为是浅拷贝)2