单链表缺点是每次都要从头开始索引,不能往回索引,很自然就会想一个办法,希望能够往回索引。这有双链表就产生了。
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);
结果:
完成插入和删除操作后面,基本功能都能够实现。