美文网首页
双向链表的添加和删除

双向链表的添加和删除

作者: 7_c5dc | 来源:发表于2019-05-19 18:51 被阅读0次
struct DoubleList {
    int data;
    struct DoubleList *prior;
    struct DoubleList *next;
};

void insert(DoubleList **pHead, int data) {
    if (*pHead == nil) { //空链表,需要创建
        *pHead = (DoubleList *)malloc(sizeof(DoubleList));
        (*pHead)->data = data;
        (*pHead)->next = nil;
        (*pHead)->prior = nil;
        return;
    }
    DoubleList *head = *pHead;

    DoubleList *insertList = (DoubleList *)malloc(sizeof(DoubleList));
    insertList->data = data;

    while ((head)) {
        if (head->data > data) { //如果当前的位置比插入的数字大,插入即可
            if (head->prior == nil) { //插入的位置是首部
                insertList->prior = nil;
                insertList->next = head;
                head->prior = insertList;
                head = insertList;
                *pHead = head;
                break;
            } else {
                insertList->prior = (head)->prior;
                (head)->prior->next = insertList;
                insertList->next = (head);
                (head)->prior = insertList;
                break;
            }
        }
        if (head->next == nil) { //遍历到尾部,则直接插入
            insertList->next = nil;
            head->next = insertList;
            insertList->prior = head;
            break;
        }
        (head) = (head)->next;
    }
}

int deleteNode(DoubleList **pHead, int data) {
    if (pHead == nil) { return -1; }
    int ret = -1;
    DoubleList *head = *pHead;
    while (head) {
        if (head->data == data) {
            if (head->prior == nil && head->next == nil) { ////只有一个元素的删除
                head = nil;
                return data;
            } else if(head->next == nil){ //删除尾部
                head->prior->next = nil;
                return data;
            } else if(head->prior == nil) { //删除头部
                head = head->next;
                head->prior = nil;
                *pHead = head;
            } else {
                head->prior->next = head->next;
                head->next->prior = head->prior;
            }
            ret = data;
        }
        head = head->next;
    }
    return ret;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        DoubleList *pHead;
        insert(&pHead, 2); //空元素创建
        insert(&pHead, 3); //插入尾部
        insert(&pHead, 3);
        insert(&pHead, 4);//插入尾部
         insert(&pHead, 1);//插入首部
        insert(&pHead, 6); //插入尾部
        insert(&pHead, 5);//插入中间
        insert(&pHead, 6); //插入尾部
        DoubleList *test = pHead;
        while (test != NULL) {
            NSLog(@"%d", test->data);
            test = test->next;
        }
        NSLog(@"--------");
        deleteNode(&pHead, 3); //删除中间重复
        deleteNode(&pHead, 1); //删除首部
        deleteNode(&pHead, 6); //删除尾部
        test = pHead;
        while (test != NULL) {
            NSLog(@"%d", test->data);
            test = test->next;
        }
    }
    return 0;
}

相关文章

  • 双向链表python实现

    python 双向链表实现 双向链表实现 链表头部添加 链表尾部添加 插入 删除 查询结点

  • 单链表和双链表

    单链表(可以用来实现栈和队列) 删除链表的元素 添加元素 双向链表(实现LinkedList) 添加元素 删除元素

  • iOS标准库中常用数据结构和算法之链表

    ⛓双向链表 功能:对双向链表进行添加、删除功能。 头文件:#include +- 平台:POSIX 函数签名: ...

  • 数据结构 - 双向链表

    双向链表删除、添加的复杂度都会降到O(n/2). 如果频繁在尾部进行添加、删除操作,动态数组、双向链表均可选择 如...

  • 数据结构之双向链表

    1.双向链表 1.1双向链表创建示意图 分析 双向链表的遍历,添加,修改,删除的操作思路===》代码实现: 遍历 ...

  • 双向链表&双向循环链表

    一、双向链表 带有前驱结点、后区节点 双向链表的创建 双向链表插入-逻辑 双向链表删除 删除双向链表指定的元素 二...

  • 双向链表的添加和删除

  • 双向循环链表

    双向循环链表 初始化 添加元素 删除元素 输出整个链表 实现代码 尚未实现 bclist_free删除链表所有元素

  • 0x04双向链表

    1 创建双向链接 2 双向链表插入元素 3删除双向链表指定位置上的结点 4 删除双向链表指定的元素 5 在双向链表...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

网友评论

      本文标题:双向链表的添加和删除

      本文链接:https://www.haomeiwen.com/subject/nliqzqtx.html