• 双链表的增删改查基本操作(转)


    双链表
    在单链表的每个结点中再设置一个指向上一跳的前驱结点的指针域

    //结构体定义
    typedef struct _node  
    {  
        dataType data;  //链表中的数据域   
        struct _node *next;         //链表的下一跳
        struct _node *prior;        //链表的上一跳
    }LinkNode,*LinkedList;
    
    //双链表
    //创建结点
    DLinkedList DlistCreatNode(dataType data)
    {
        DLinkedList node = (DLinkedList)malloc(sizeof(DLinkedList));
        if(NULL == node)
        {
            perror("DlistCreatNode err");
            return NULL;
        }
        node->data = data;
        node->next = NULL;
        node->prior = NULL;
    
        return node;
    }
    //头插法
    int DlistInsertHead(DLinkedList L,dataType data)
    {
        DLinkedList p = DlistCreatNode(data);
        if(NULL == p)
        {
            perror("DlistCreatNode err");
            return -1;
        }
        p->next = L->next;
        p->prior = L;
        L->next->prior = p;
        L->next = p;
        return 0;
    }
    //尾插法
    int DlistInsertTail(DLinkedList L,dataType data)
    {
        DLinkedList temp = L;
        while(temp->next)
        {
            temp = temp->next;
        }
    
        DLinkedList p = DlistCreatNode(data);
        if(NULL == p)
        {
            perror("DlistCreatNode err");
            return -1;
        }
        temp->next = p;
        p->prior = temp;
        return 0;
    }
    //以序号插入
    int DlistInsertIndex(DLinkedList L,int i,dataType data)
    {
        int n = 0;
        DLinkedList temp = L;
        while(temp->next && n < i - 1)
        {
            temp = temp->next;
        }
        if(n < (i-1) || !temp)
        {
            return -2;//超出链表长度
        }
        DLinkedList p = DlistCreatNode(data);
        if(NULL == p)
        {
            perror("DlistCreatNode err");
            return -1;
        }
        p->next = temp->next;
        p->prior = temp->prior;
        temp->next->prior = p;
        temp->next = p;
        return 0;
    }
    //删除某一值得结点
    int DlistDeleteValue(DLinkedList L,dataType data)
    {
        int n = 0;
        DLinkedList temp = L;
        while(temp->next )
        {
            temp = temp->next;
            if(temp->data == data)
            {
                temp->next->prior = temp->prior;
                temp->prior->next = temp->next;
                n++;
            }
        }
        return n;
    }
    //printList
    int printDLinkList(DLinkedList L)
    {
        DLinkedList temp = L;
        while(temp->next)
        {
            temp = temp->next;
            printf("%4d ",temp->data);
        }
        printf("\r\n");
        return 0;
    }
    
    int main()
    {
        //双链表
        DLinkedList d_List;
        dList = DlistCreatNode(NULL);
    
        for(int i = 100;i < 110;i++)
            DlistInsertTail(d_List,i);  //创建一个链表
        printDLinkList(d_List);
    
        DlistInsertHead(d_List,99);
        printDLinkList(d_List);
    
        return 0;
    }
    

    https://blog.csdn.net/leumber/article/details/78224011

  • 相关阅读:
    多轨车皮编序问题
    [Luogu1032] 字串变换
    [POJ1101] The Game
    Linux 下源码编译FFMEG
    交叉编译 tcpdump
    现代电视原理-电视传像原理
    Dos:‘锘緻echo’ 不是内部或外部命令,也不是可运行的程序或批处理文件
    Win7 登入壁纸修改
    Office 2016安装后的优化设置
    Linux 系统目录结构
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16527284.html
Copyright © 2020-2023  润新知