有序链表 -> 参数更换为 addr + reg

有序链表的参数更换为 addr + reg

// 有序双链表 -> addr + reg
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

typedef enum{
    FALSE = 0,
    TRUE = 1,
}STATUS;

typedef struct _DOUBLE_LINK_NODE
{
    int addr;
    int reg;
    struct _DOUBLE_LINK_NODE* prev;
    struct _DOUBLE_LINK_NODE* next;
}DOUBLE_LINK_NODE;

//1. 删除双向链表
void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode);
//2. 双向链表中插入地址+寄存器值
STATUS insert_addr_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int value_addr, int value_reg);
//3. 双向链表中删除地址
STATUS delete_addr_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int value_addr);
//4. 统计双向链表中地址的个数
int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode);
//5. 打印双向链表中地址
void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode);

DOUBLE_LINK_NODE* mb_poll_link;
int main()
{
    insert_addr_into_double_link(&mb_poll_link, 88, 0);
    print_double_link_node(mb_poll_link);
    insert_addr_into_double_link(&mb_poll_link, 22, 0);
    insert_addr_into_double_link(&mb_poll_link, 55, 0);
    insert_addr_into_double_link(&mb_poll_link, 11, 0);
    insert_addr_into_double_link(&mb_poll_link, 44, 0);
    insert_addr_into_double_link(&mb_poll_link, 33, 0);
    insert_addr_into_double_link(&mb_poll_link, 66, 0);

    delete_addr_from_double_link(&mb_poll_link, 33);
    delete_addr_from_double_link(&mb_poll_link, 44);

    print_double_link_node(mb_poll_link);
    printf("main end!\n");
    return 0;
}

//static //创建双向链表节点
DOUBLE_LINK_NODE* create_double_link_node(int value_addr, int value_reg) {
    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->addr = value_addr;
    pDLinkNode->reg = value_reg;
    return pDLinkNode;
}

// static //在双向链表中查找数据
DOUBLE_LINK_NODE* find_addr_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int addr) {
    DOUBLE_LINK_NODE* pNode = NULL;
    if (NULL == pDLinkNode)
        return NULL;

    pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
    while (NULL != pNode){
        if (addr == pNode->addr)
            return pNode;
        pNode = pNode->next;
    }
    return NULL;
}

//1. 删除双向链表
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);    //调用自身函数循环free
}

//2. 双向链表中插入数据
STATUS insert_addr_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int value_addr, int value_reg)
{
    DOUBLE_LINK_NODE* pNode;
    DOUBLE_LINK_NODE* pIndex;

    if(NULL == ppDLinkNode)                                        // 原链表首地址 空        ->FALSE
        return FALSE;

    if(NULL == *ppDLinkNode){                                    // 原链表 空            ->直接加入
        pNode = create_double_link_node(value_addr, value_reg);
        assert(NULL != pNode);
        *ppDLinkNode = pNode;
        (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
        return TRUE;
    }

    if (NULL != find_addr_in_double_link(*ppDLinkNode, value_addr))    // 原链表存在数据addr    ->FALSE
        return FALSE;

    pNode = create_double_link_node(value_addr, value_reg);                        //
    assert(NULL != pNode);

    pIndex = *ppDLinkNode;                                        // 赋值链表首地址
    #if 0        //添加的先后顺序
    while (NULL != pIndex->next)// 找到最后一个节点
        pIndex = pIndex->next;

    pNode->prev = pIndex;
    pNode->next = pIndex->next;
    pIndex->next = pNode;
    #endif
    #if 1        //递增
    if(pIndex->addr>value_addr)                // 起始位置 ->OK ?
    {
        *ppDLinkNode = pNode;
        pNode->prev = NULL;
        pNode->next = pIndex;
        pIndex->prev = pNode;
    }
    else
    {
        while (NULL != pIndex->next)// 找到最后一个节点
            pIndex = pIndex->next;
        if(pIndex->addr<value_addr){            // 结束位置 ->OK ?
            pNode->prev = pIndex;
            pNode->next = pIndex->next;
            pIndex->next = pNode;
        }
        else{                            // 中间位置
            pIndex = *ppDLinkNode;//首地址向后
            while (pIndex->addr<value_addr)
                pIndex = pIndex->next;
            pNode->prev = pIndex->prev;
            pNode->next = pIndex;
            pIndex->prev->next = pNode;
            pIndex->prev = pNode;
        }
    }
    #endif
    #if 0        //递减
    if(pIndex->addr<value_addr)                // 起始位置 ->OK ?
    {
        *ppDLinkNode = pNode;
        pNode->prev = NULL;
        pNode->next = pIndex;
        pIndex->prev = pNode;
    }
    else
    {
        while (NULL != pIndex->next)// 找到最后一个节点
            pIndex = pIndex->next;
        if(pIndex->addr>value_addr){            // 结束位置 ->OK ?
            pNode->prev = pIndex;
            pNode->next = pIndex->next;
            pIndex->next = pNode;
        }
        else{                            // 中间位置
            pIndex = *ppDLinkNode;//首地址向后
            while (pIndex->addr>value_addr)
                pIndex = pIndex->next;
            pNode->prev = pIndex->prev;
            pNode->next = pIndex;
            pIndex->prev->next = pNode;
            pIndex->prev = pNode;
        }
    }
    #endif

    return TRUE;
}

//3. 双向链表中删除数据
STATUS delete_addr_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int value_addr)
{
    DOUBLE_LINK_NODE* pNode;
    if (NULL == ppDLinkNode || NULL == *ppDLinkNode)                // "原链表首地址"或“原链表” 空        ->FALSE
        return FALSE;

    pNode = find_addr_in_double_link(*ppDLinkNode, value_addr);
    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;                        // 下一个节点的 prev = 节点的prev
        pNode->prev->next = pNode->next;                            // 前一个节点的 next = 节点的next
    }

    free(pNode);
    return TRUE;
}

//4. 统计双向链表中数据的个数
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;
}

//5. 打印双向链表中数据
void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)
{
    DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
    printf("print_double_link -> start\n");
    while (NULL != pNode){
        printf("%d  %d\n", pNode->addr,pNode->reg);
        pNode = pNode->next;
    }
    printf("print_double_link -> end\n");
}
时间: 2024-10-11 03:55:56

有序链表 -> 参数更换为 addr + reg的相关文章

多个有序链表的合并

1, 先将问题简化,合并两个有序链表 首先分析合并两个链表的过程.我们的分析从合并两个链表的头结点开始.链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点.如下图所示. 参考:http://www.cnblogs.com/jason2013/articles/4341153.html 使用递归方法,一步步生成头结点,代码如下 递归的要诀是子问题要和父问题完全一样,只是规模变小(每次调用,更小的参数值), 1 List merge(List head1, List

链表(14)----合并两个有序链表

1.链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.合并两个有序链表 ListElement_t * MergeList( ListElement_t *

23. Merge k Sorted Lists 合并K个有序链表

这道题是21题合并2个有序链表的升级版本,看了许多解题思路: A:直接暴力解锁,全部放进一个堆,然后依次吐出来: B:利用21题的算法,循环一次做两两合并,这样就得到结果:但是时间复杂度有点差: C:利用归并排序思想,进行分治:其实就是利用递归,牺牲空间,提升时间效率: 存在的问题是:看过了许多解答后发现,大家基于的给定数据类型是 List<ListNode>/ArrayList<ListNode>,然后,现在系统更新了,给的数据类型是 ListNode[] lists,所以,我现

两个有序链表合成一个有序链表

RT.... 无聊帮朋友撸个 C++ 作业.. = = 1 /* 2 无聊帮朋友撸个作业...... \ = v = / 3 4 两个有序链表合成为一个有序链表. 5 要求: 6 1. 每个链表元素里的值不超过int范围. 7 2. 两个链表要求为升序(从小到大). 8 9 10 2016.1.5 author : 加德满都的猫会爬树 11 12 */ 13 14 #include <iostream> 15 using namespace std; 16 const int MAX = 10

leetcode:Merge Two Sorted Lists(有序链表的归并)

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 分析:思路比较简单,遍历两个有序链表,每次指向最小值. code如下: /** * Definition for singly-linked list. * struct ListNode { * int val;

将两个有序链表合并

题目:已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序.(保留所有结点,即便大小相同) 循环实现: 1.重新申请一个头结点,使用指针p指向他,每新加一个结点,就将指针p后移一位,即指针p永远指向新链表的尾结点 2.由于所用链表第一个结点不赋值,因此指针需要开始从头结点的下一个结点开始判断,如果两个指针都为非空,将data域较小的指针连在新链表的末尾 3.当两个指针有一个到达链表的结尾时,将没有到达末尾的链表连接到新链表之后 递归实现: 1.函数返回条件是有一个链表结

链表(三)——链表删除冗余结点&amp;插入结点到有序链表

1.一个以递增方式排列的链表,去掉链表中的冗余值. 思路一:设有两个指针p和q,使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除. 思路二:设有两个指针p和q,使p在前,q在后,只要找到一个冗余就删除一个,依次往后删除. 输入的链表:1 3 3 3 3 6 6 8 9 10 删除后的链表:1 3 6 8 9 10 比较两种思路,思路二的想法相比于思路一要好,所以这里实现思路二的代码. 2.将一个结点插入到一个有序的链表中. 思路:首先要判定这个链表是递增排

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

LeetCode:Merge Two Sorted Lists - 拼接两个有序链表

1.题目名称 Merge Two Sorted Lists(按升序拼接两个有序链表) 2.题目地址 https://leetcode.com/problems/merge-two-sorted-lists/ 3.题目内容 英文:Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two l