データ構造-リニアテーブル-シングルチェーンテーブル

8050 ワード

シングルチェーンの定義
シングルチェーン表:次のノードを指す構造体を持つ.
機能の説明
  • 新しいチェーンテーブル
  • を作成します.
  • 取得長さ
  • インデックス検索
  • 値で
  • を検索します.
  • 、あるノード
  • を削除する.
  • 特定の結点値を変更する
  • 後に結点を追加します.
  • すべての結点内容を表示する
  • コードの実装
    #include 
    #include 
    
    typedef struct LNode{
        int num;
        LNode * next;
    };
    //    
    LNode * creatLNode(){
        LNode * lNode=(LNode *)malloc(sizeof(LNode));
        lNode->next=NULL;
        return lNode;
    }
    //    
    int lengthLNode(LNode *L){
        int i=0;
        LNode *lNode=L;
        while(lNode->next!=NULL){
            lNode=lNode->next;
            i++;
        }
        return i+1;//   +1,            , i    , +1
    }
    int getLenth(LNode *L){
        int length=0;
        LNode *p=L;
        while (p){
            p=p->next;
            length++;
        }
        return length;
    }
    //        
    bool addLnode(LNode * L,int num){
        LNode * last=L;
        LNode * lnode=(LNode *)malloc(sizeof(LNode));
        lnode->num=num;
        lnode->next=NULL;
        while (last->next!=NULL){
            last=last->next;
        }
        last->next=lnode;
        return true;
    }
    //        
    LNode * findNodeByIndex(LNode *L,int index){
        LNode *p=L;
        int i=0;
        while (p!=NULL&&i<index){
            p=p->next;
            i++;
        }
        if(i==index)return p;
        else return NULL;
    }
    //      
    LNode *findLNodeByValue(LNode *L,int value){
        LNode *p=L;
        while(p){
            if(p->num==value){
                return p;
            }
            p=p->next;
        }
        return NULL;
    }
    LNode * findLNodeByV2(LNode *L, int value){
        LNode *p=L;
        while (p!=NULL&&p->num!=value){
            p=p->next;
        }
        return p;
    }
    //           
    //          ,          
    LNode* insert(LNode *L,int index,int num){
        LNode* p;
        LNode *newL=(LNode *)malloc(sizeof(LNode));
        newL->num=num;
        if (index==0){
            newL->next=L;
            return newL;
        }
        //     
        p=findNodeByIndex(L,index-1);
        //      
        if (p=NULL){
            return NULL;
        }
        //      
        newL->next=p->next;
        p->next=newL;
        return L;
    }
    //      
    bool changeValueByIndex(LNode *L,int index, int value){
        if (index<0||index>getLenth(L)){
            return false;
        }
        LNode * p=findNodeByIndex(L,index);
        p->num=value;
        return true;
    }
    //             ,             
    LNode * delNodeByIndex(LNode *L,int index){
        if (index==0){
            LNode *p=L;
            p=p->next;
            free(L);
            return p;
        }
        LNode * p1=findNodeByIndex(L,index-1);
        if (p1==NULL||p1->next==NULL){
            return NULL;
        }
        LNode *p2=p1->next;
        p1->next=p2->next;
        free(p2);
        return L;
    }
    
    //        
    void showAllLNode(LNode *L){
        LNode * lNode=L;
        while(lNode){
            printf("%d\t",lNode->num);
            lNode=lNode->next;
        }
        printf("
    "
    ); } int main(){ LNode *lNode=creatLNode(); for (int i = 0; i <10 ; i++) { addLnode(lNode,i); } LNode *head=findNodeByIndex(lNode,0); changeValueByIndex(lNode,0,-1); lNode=delNodeByIndex(lNode,5); showAllLNode(lNode); return 0; }