シングルチェーン表の添削は基本操作を調べます.

15088 ワード

単鎖表のいくつかの基本的な操作は、添削して調べます.
    //    
    typedef int dataType;   
    typedef struct _node  
    {  
        dataType data;              //           
        struct _node *next;          //          
    }LinkNode,*LinkedList;  

    //                            

    //1.    , data NULL        
    LinkedList listCreatNode(dataType data)
    {
        LinkedList p = NULL;

        p = (LinkedList)malloc(sizeof(LinkNode));
        if(p == NULL)
        {
            perror("listCreatNode err");
            return NULL;
        }
        p->data = data;
        p->next = NULL;
        return p;
    }

    //2.                     
    int listInsertHead(LinkedList L,dataType data)
    {
        LinkedList node = listCreatNode(data);
        if(node == NULL)
        {
            perror("listCreatNode err");
            return -1;
        }
        node->next = L->next;   //                 (    )
        L->next = node;         //                (      )
        return 0;

    }
    //3.                    
    int listInsertTail(LinkedList L,dataType data)
    {
        LinkedList temp;
        temp = L;
        LinkedList node = listCreatNode(data);
        if(node == NULL)
        {
            perror("listCreatNode err");
            return -1;
        }
        while(temp->next != NULL)   //        
        {
            temp = temp->next;
        }
        temp->next = node;
        return 0;
    }
    //4.      
    int listInsertIndex(LinkedList L,int i,dataType data)
    {
        int n = 0;
        LinkedList temp = L;

        while(temp->next && n < (i-1))
        {
            n++;
            temp = temp->next;
        }
        if(n < (i-1) || !temp)
        {
            return -2;//      
        }
        LinkedList node = listCreatNode(data);
        if(node == NULL)
        {
            perror("listCreatNode err");
            return -1;
        }
        node->next = temp->next;
        temp->next = node;
        return 0;

    }
    //5.       ,         
    int listGetValue(LinkedList L,int i,dataType *data)
    {
        int n = 0;
        LinkedList temp = L;
        while(temp->next && n < i)
        {
            n++;
            temp = temp->next;
        }
        if(n < i)
        {
            return -2;//      
        }
        *data = temp->data;
        return 0;
    }
    //6.     ,            
    dataType* listGetIndex(LinkedList L,int *i,dataType data)
    {
        int n = 0;
        LinkedList temp = L;
        while(temp->next)
        {
            temp = temp->next;
            n++;
            if(data == temp->data)
            {
                *i = n;
                return &(temp->data);
            }
        }
        return NULL;
    }
    //7.       
    /*!
     * @brief listChangeValue
     *                 
     * @param L             
     * @param olddata               
     * @param newdata               
     *        - 
     *        - 
     * @return  > 0        
                < 0     ,   
     */
    int listChangeValue(LinkedList L,dataType olddata,dataType newdata)
    {
        LinkedList temp = L;
        int flag = 0;
        while(temp->next)
        {
            if(temp->data == olddata)
            {
                temp->data = newdata;
                flag++;
            }
            temp = temp->next;
        }
        if(flag)
            return flag;
        else
            return -1;
    }
    //8.    
    /*!
     * @brief listDeleteValue
     *              
     * @param L             
     * @param data             
     *        - 
     *        - 
     * @return  > 0        
                < 0     ,   
     */
    int listDeleteValue(LinkedList L,dataType data)
    {
        LinkedList temp = L;
        LinkedList tempn = L->next;
        int flag = 0;
        while(tempn->next)
        {

            if(tempn->data == data)
            {
                temp->next = tempn->next;
                free(tempn);
                flag++;
            }
            temp = temp->next;
            tempn = temp->next;
        }
        if(flag)
            return flag;
        else
            return -1;
    }
    //9.    
    int listClearList(LinkedList L)
    {
        LinkedList temp = L;
        while(L->next)
        {
            temp = L;
            L= L->next;
            free(temp);
        }
        return 0;
    }
    //10.    printList
    int printLinkList(LinkedList L)
    {
        LinkedList temp = L;
        while(temp->next)
        {
            temp = temp->next;
            printf("%4d ",temp->data);
        }
        printf("\r
"
); return 0; } // int main() { // int m_data = 0,m_index = 0; LinkedList hList; hList = listCreatNode(NULL); // for(int i = 100;i < 110;i++) listInsertTail(hList,i); // printLinkList(hList); listInsertHead(hList,99); // printLinkList(hList); listInsertIndex(hList,2,98); // printLinkList(hList); listGetValue(hList,2,&m_data); // printf("getValue=%d\r
"
,m_data); listGetIndex(hList,&m_index,103);// printf("getIndex=%d\r
"
,m_index); listChangeValue(hList,105,100); // printLinkList(hList); listDeleteValue(hList,100); // printLinkList(hList); listClearList(hList); // system("pause"); return 0; }
テスト結果:
 100  101  102  103  104  105  106  107  108  109
  99  100  101  102  103  104  105  106  107  108  109
  99   98  100  101  102  103  104  105  106  107  108  109
getValue=98
getIndex=6
  99   98  100  101  102  103  104  100  106  107  108  109
  99   98  101  102  103  104  106  107  108  109
       . . .