算法学习记录-双链表

 

单链表缺点是每次都要从头开始索引,不能往回索引,很自然就会想一个办法,希望能够往回索引。这有双链表就产生了。

 

0.双链表结构:

typedef struct lNode{
    int data;
    struct lNode* pri;
    struct lNode* next;
}ltNode,*ptNode;

增加了一个前驱指针,这有就可以向回索引了。

1.双链表的初始化

//1.双向链表的init
void dlist_init(ptNode* head)
{
    *head = (ptNode)malloc(sizeof(ltNode));
    (*head)->data = 0;
    (*head)->pri  = NULL;
    (*head)->next = NULL;
}

 

2.双链表的插入

通过画图

 

 

//2.双向链表的插入
int dlist_insert(ptNode list,int index,int elem)
{
    int len = list->data;
    if(len < index)            //如果插入的位子超出范围,按增加链表处理。
    {
        dlist_add(list,elem);
        return 0;
    }

    ptNode n = (ptNode)malloc(sizeof(ltNode));
    n->data = elem;
    n->pri = NULL;
    n->next = NULL;

    ptNode pos = list;
    while(index > 0)
    {
        pos=pos->next;
        index--;
    }
    n->next = pos;                //(1)
    n->pri = pos->pri;            //(2)
    pos->pri->next = n;            //(3)
    pos->pri = n;                //(4)
    

    list->data = list->data+1;
    return 1;
}

对照程序 (1)(2)(3)(4)和图中过程看。
其中,如果插入在最后的位置,则调用

dlist_add(list,elem);

 

调用和结果:

用insert函数创建一个表:

   int ary[10] = {2,6,55,34,45,19,82,9,36,12};
    ptNode list = NULL;


    dlist_init(&list);
    prt_list(list);
    getchar();
    
    int i=0;
    printf("create!\n");
    for (i=0;i<10;i++)
    {
        dlist_insert(list,i+1,ary[i]);
    }
    prt_list(list);
    getchar();


运行后:

 

printf("insert:\n");
dlist_insert(list,1,99);
prt_list(list);

dlist_insert(list,9,88);
prt_list(list);

 

然后再调用插入:


 

3.双链表的删除

画图过程:

 

 

//3.双向链表的删除
int dlist_delete(ptNode list,int index)
{
    int len = list->data;
    if(len < index)
    {
        printf("error:over range\n");
        return 0;
    }

    ptNode pos = list;
    while(index > 0)
    {
        pos=pos->next;
        index--;
    }
    pos->pri->next = pos->next;   //(1)
pos
->next->pri = pos->pri;   //(2) free(pos);            //(3)        list->data = list->data-1; return 1; }


 主函数调用:

printf("delete:\n");
dlist_delete(list,1);
prt_list(list);

dlist_delete(list,5);
prt_list(list);

 

结果:

完成插入和删除操作后面,基本功能都能够实现。

 

 

 

posted @ 2013-11-01 15:56  sjdang  阅读(225)  评论(0编辑  收藏  举报