通用链表

作者: 76577fe9b28b | 来源:发表于2017-05-05 17:46 被阅读9次

    1.头文件

    #ifndef LinkList_h
    #define LinkList_h
    
    #include <stdio.h>
    
    typedef struct Node{
        
        struct Node *next;
        
    }Node;
    
    typedef struct LinkNode{
        
        Node node;
        void * data;
    }LinkNode;
    
    typedef struct LinkList{
        
        //链表长度
        int length;
        
        //链表的头结点
        LinkNode listNode;
    }LinkList;
    
    //初始化链表
    void initList(LinkList *list);
    
    //判断链表是否为空
    int emptyList(LinkList *list);
    
    //清空链表
    void clearList(LinkList *list);
    
    //获取指定位置的数
    void getDataByIndex(LinkList *list, int index, void **da);
    
    //在指定位置插入数据
    void insertDataByIndex(LinkList *list,int index, void *da);
    
    //删除指定位置的数据,并把数据存到da中
    void deleteDataByIndex(LinkList *list, int index,void **da);
    
    //获取链表的长度
    int getLength(LinkList *list);
    
    
    #endif /* LinkList_h */
    
    

    2.实现

    #include "LinkList.h"
    #include <stdlib.h>
    //初始化链表
    void initList(LinkList *list){
        
        list->length = 0;
        list->listNode.node.next = NULL;
        
    }
    
    //判断链表是否为空
    int emptyList(LinkList *list){
        
        if (list->length > 0) {
            
            return 1;
        }
        
        return 0;
    }
    
    //清空链表
    void clearList(LinkList *list){
        
        while (emptyList(list)) {
            
            int *da;
            deleteDataByIndex(list, 0, &da);
            
            printf("%d\n", *da);
        }
    
    }
    
    //获取指定位置的数
    void getDataByIndex(LinkList *list, int index, void **da){
        
        if (index < 0 || index >= list->length ) {
            
            return;
        }
        
        LinkNode *pNode = &list->listNode;
        
        for (int i = 0; i <= index; i++) {
            
            pNode = (LinkNode *)pNode->node.next;
        }
        
        *da = pNode->data;
        
    }
    
    //在指定位置插入数据
    void insertDataByIndex(LinkList *list,int index, void *da){
        
        if (index < 0 || index > list->length) {
            
            return;
        }
        
        //开辟结点空间
        LinkNode *linkNode = calloc(1, sizeof(*linkNode));
        linkNode->data = da;
        linkNode->node.next = NULL;
        
        //记录插入点的前一个结点
        LinkNode *pNode = &list->listNode;
        
        for (int i = 0; i < index; i++) {
            
            pNode = (LinkNode *)pNode->node.next;
            
        }
        
        linkNode->node.next = pNode->node.next;
        pNode->node.next = &linkNode->node;
        
        list->length++;
    }
    
    //删除指定位置的数据,并把数据存到da中
    void deleteDataByIndex(LinkList *list, int index,void **da){
        
        if (index < 0 || index >= list->length ) {
            
            return;
        }
        
        //记录插入点的前一个结点
        LinkNode *pNode = &list->listNode;
        
        for (int i = 0; i < index; i++) {
            
            pNode = (LinkNode *)pNode->node.next;
        }
        
        LinkNode *cNode = (LinkNode *)pNode->node.next;
        pNode->node.next = cNode->node.next;
        
        *da = cNode->data;
        free(cNode);
        
        list->length--;
    }
    
    //获取链表的长度
    int getLength(LinkList *list){
        
        return list->length;
    }
    

    相关文章

      网友评论

        本文标题:通用链表

        本文链接:https://www.haomeiwen.com/subject/vpjstxtx.html