intGetElem(Linklist &HEAD , int i){ if(i < 0 || i >= GetLength(HEAD)) {cout << "the index is invalid" << endl ; return0 ;} Lnode *p = HEAD->next ; int j = 0 ; while(j != i){ j++ ; p = p->next ; } return p->data ; }
根据值确定结点索引
1 2 3 4 5 6 7 8 9 10 11
intLocateElem(Linklist &HEAD , int value){ Lnode *p = HEAD->next ; int i = 0 ; while(p){ if(value == p->data) return i ; p = p->next ; i++ ; } cout << value << "not in this linkedlist" << endl ; return-1 ; }
插入结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14
voidListInsert(Linklist &HEAD , int i , int data){ if(i < 0 || i > GetLength(HEAD)) {cout << "the index is invalid" << endl ; exit(0) ;} Lnode *p = HEAD ; int j = -1 ; while(p && (j!=i-1)){ p = p->next ; j++ ; } Lnode *s = new Lnode ; s->data = data ; s->next = HEAD->next ; HEAD->next = s ; cout << "Insert " << data << " in the index " << '[' << i << "] successfully !" << endl ; }
tips: 此处p = HEAD从HEAD开始,j=-1j从-1开始,是为了i=0的特殊情况。
删除元素
1 2 3 4 5 6 7 8 9 10 11 12 13
voidDeleteElem(Linklist &L , int i){ if(i < 0 || i >= GetLength(L)) {cout << "the index i is invalid" << endl ; exit(0) ;} Lnode *p = L ; int j = -1 ; while(p && (j!=i-1)){ p = p->next ; j++ ; } Lnode *s = p->next ; p->next = s->next ; delete s ;
voidCreateList_H(Linklist &L , int n){ //insert the nodes from the head of linkedlist L = new Lnode ; L->next = NULL ; for(int i = n - 1 ; i >= 0 ; i--){ Lnode *p = new Lnode ; cin >> p->data ; p->next = L->next ; L->next = p ; } }
尾插法创建链表
1 2 3 4 5 6 7 8 9 10 11 12
voidCreateList_T(Linklist &L , int n ){ //Insert elements from the tail of linkedlist L = new Lnode ; L->next = NULL ; Lnode *T = L ; for(int i = 0 ; i < n ; i++){ Lnode *p = new Lnode ; cin >> p->data ; T->next = p ; T = T->next ; p->next = NULL ; }
#include<iostream> usingnamespace std ; typedefstructDoubleLinkedList { int data ; structDoubleLinkedList *prior , *next ; }DLNode , *DLList; voidInitDLList(DLList &HEAD){ HEAD = new DLNode ; HEAD->next = NULL ; HEAD->prior = NULL ; } voidCreateList_DL(DLList &HEAD , int n){ for(int i = 0 ; i < n ; i++){ DLNode *p = new DLNode ; cin >> p->data ; p->next = HEAD->next ;
if(HEAD->next){ HEAD->next->prior = p ; } //i = 0 时,插入第一个元素时,HEAD->next 为NULL, NULL是没有的,即NULL->prior是访问不到的,segmentation fault //因此当HEAD->next不为NULL时,才会执行HEAD->next->prior = p //当HEAD->next 为NULL,也就是创建第一个结点时,不要让(也没法让)NULL->prior = p
HEAD->next = p ; p->prior = HEAD ; } } intGetLength_DL(DLList &HEAD){ int length = 0 ; DLNode *p = HEAD->next; while(p){ length++ ; p = p->next ; } return length ; } voidPrintList_DL(DLList &HEAD){ DLNode *p = HEAD->next ; for(int i = 0 ; i < GetLength_DL(HEAD) ; i++){ cout << p->data << " " ; p = p->next ; } cout << endl ; } voidInsertList_DL(DLList &HEAD , int i , int data){ if( i < 0 || i > GetLength_DL(HEAD)) {cout << "the index is invalid" << endl ; exit(0) ;} DLNode *p = HEAD ; for(int j = 0 ; j < i ; j++){ p = p->next ; } DLNode *s = new DLNode ; s->data = data ; s->next = p->next ; if(p->next){ p->next->prior = s ; } p->next = s ; s->prior = p ;
} voidDeleteElem_DL(DLList &HEAD , int i){ if(i < 0 || i >= GetLength_DL(HEAD)) {cout << "the index is invalid " << endl ; exit(0) ;} DLNode *p = HEAD->next ; while(i--){ p = p->next ; } p->prior->next = p->next ; p->next->prior = p->prior ; delete p ; } intmain(){ DLList HEAD ; InitDLList(HEAD) ; CreateList_DL(HEAD , 6) ; PrintList_DL(HEAD) ; InsertList_DL(HEAD , 2 , 821) ; PrintList_DL(HEAD) ; DeleteElem_DL(HEAD , 1) ; PrintList_DL(HEAD) ; return0 ; }
常见bugs
未考虑NULL的特殊性,执行NULL->next操作。编译器还不会爆出错误信息,满大街找bug.
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
voidInsertList_DL(DLList &HEAD , int i , int data){ if( i < 0 || i > GetLength_DL(HEAD)) {cout << "the index is invalid" << endl ; exit(0) ;} DLNode *p = HEAD ; for(int j = 0 ; j < i ; j++){ p = p->next ; } DLNode *s = new DLNode ; s->data = data ; s->next = p->next ; if(p->next){ p->next->prior = s ; }//加入判断p->next是否为NULL p->next = s ; s->prior = p ; }