双链表的增删改查基本操作

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

//结构体定义
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;
}

你可能感兴趣的:(数据结构)