單鏈表的插入和刪除

單鏈表的插入是找到要插入位置的前一個結點的位置,而後用指針將它們從新的鏈接在一塊兒。單鏈表的刪除是找到要插入位置的前一個結點的位置,而後斷開刪除的指針,從新將當前指針與刪除的指針的下一個元素鏈接在一塊兒,最後釋放刪除元素的內存空間。詳情請看下面的代碼:ios

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//按位序插入單鏈表(帶頭節點)
bool ListInsert(LinkList &L,int i,int e){
    if(i<1){
        return false;
    }
    LNode *p;//指向當前表結點的指針
    int j = 0;//當前p指向的是第幾個結點
    p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 
    if(p!=NULL&&j<i-1){
        p = p->next;
        j++;
    } 
    /*
    if(p==NULL){//i值不合法(可能超出單鏈表的長度) 
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;//將結點的值存入s結點中 
    s->next = p->next;//將s結點鏈接到p的下一個結點上 
    p->next = s;//將p結點鏈接到s結點上 (上下兩句位置不可換)
    */
    return InsertNextNode(p,e);
}

//指定結點後插操做
bool InsertNextNode(LNode *p,int e){
    if(p==NULL){//當前p指針指向的結點正常指向下一個結點 
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if(s==NULL){//內存不足 
        return false;
    }
    s->data = e;//存放數據 
    s->next = p->next; 
    p->next = s;//將s鏈接 
    return true;
} 

//指定結點前插操做
bool InsertPriorNode(LNode *p,int e){
    if(p==NULL){
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    s->next = p->next;//鏈接結點 
    p->next = s;
    s->data = p->data;//交換數據 
    p->data = e;
}

//按位序刪除單鏈表(帶頭節點)
bool ListInsert(LinkList &L,int i,int &e){
    if(i<1){
        return false;
    }
    LNode *p;//指向當前表結點的指針
    int j = 0;//當前p指向的是第幾個結點
    p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 
    if(p!=NULL&&j<i-1){
        p = p->next;
        j++;
    } 
    if(p==NULL){//i值不合法(可能超出單鏈表的長度) 
        return false;
    }
    if(p->next==NULL){//i-1結點後無結點
        return false;
    }
    LNode *q = p->next;//q指向將要刪除的結點 
    e = q->data;//用e返回刪除的元素值 
    p->next = q->next;//把p與刪除後的下一個結點鏈接 
    free(q);//釋放q結點的內存空間 
    return true;
}
相關文章
相關標籤/搜索