美文网首页
doubleLinkedList(双链表)

doubleLinkedList(双链表)

作者: Mustard_Buli | 来源:发表于2016-03-01 21:10 被阅读79次
    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    typedef struct node{
        struct node *previous;
        int age;
        struct node *next;
    }Node;
    
    //创建一个结点
    Node *createNode(){
        //创建一个新德头结点
        Node *pTemp = (Node *)malloc(1 * sizeof(Node));
        if (pTemp == NULL) {
            return NULL;
        }
        
        //赋初值
        pTemp->previous = NULL;
        pTemp->next = NULL;
        pTemp->age = 0;
    
        //返回这个结点的地址
        return pTemp;
    }
    
    //创建头结点
    bool createHeader(Node **pHeader){
        //创建一个新德头结点
        *pHeader = createNode();
        
        if (pHeader == NULL) {
            return false;
        } else {
            return true;
        }
    }
    
    //是否继续
    bool isContinue(){
        char option;
        do {
            getchar();
            printf("是否继续添加(y/n)?:");
            option = getchar();
        } while (option != 'y' && option != 'n');
        
        if (option == 'y') {
            return true;
        } else{
            return false;
        }
    }
    
    //initial
    void initial(Node * const pHeader){
        Node *pTail = pHeader;
        
        //添加保存数据的结点
        while (1) {
            //需要创建一个结点
            Node *pTemp = createNode();
            if (pTemp == NULL) {
                exit(EXIT_FAILURE);
            }
            printf("请输入年龄:");
            scanf("%d", &pTemp->age);
            
            //判断添加的位置
            if (pHeader->next == NULL) {
                //头结点指向第一个结点
                pHeader->next = pTemp;
                
                //第一个结点的previous指向头结点
                pTemp->previous = pHeader;
                
                //第一个结点的next指向头结点
                pTemp->next = pHeader;
                
                //头结点的previou指向第一个结点
                pHeader->previous = pTemp;
                
                //pTail指针指向第一个结点
                pTail = pTemp;
                
            } else{
                //前面已经存在结点了
                //让尾结点的next指向pTemp
                pTail->next = pTemp;
                
                //让pTemp的previous指针指向目前的尾结点
                pTemp->previous = pTail;
                
                //让pTail指向最后一个结点pTemp
                pTail = pTemp;
                
                //尾结点的next指针指向头结点
                pTail->next = pHeader;
                
                //头结点的previous指针指向尾结点
                pHeader->previous = pTail;
            }
            
            //提问是否继续
            if (isContinue() == false){
                break;
            }
        }
       
    }
    
    //输出链表的内容
    void show(const Node * const pHeader){
        Node *pTemp = pHeader->next;
        
        while (pTemp != NULL) {
            printf("%d ", pTemp->age);
            pTemp = pTemp->next;
            
            if (pTemp == pHeader) {
                break;
            }
        }
        printf("\n");
    }
    
    //获取index对应的结点的地址
    Node *addressOfIndex(Node *pHead, int index){
        Node *pTemp = pHead->next;
        
        while (index > 0) {
            if (pTemp == pHead) {
                //节点数少于index
                break;
            }else{
                pTemp = pTemp->next;
            }
            
            index--;
        }
        
        if (index > 0) {
            printf("删除的元素不存在\n");
            return NULL;
        }else{
            //让pTemp指向即将被我删除的那个结点
            pTemp = pTemp->previous;
            return pTemp;
        }
    }
    
    //插入一个元素
    //删除
    void delete(Node *pHead, int index){
        //获取index对应的结点的地址
        Node *pIndex = addressOfIndex(pHead, index);
        
        if (pIndex == NULL) {
            printf("删除的元素不存在\n");
            exit(EXIT_FAILURE);
        } else{
            //让index前面的结点next指针指向index后面的结点
            pIndex->previous->next = pIndex->next;
            
            //让index后面的结点的previous指针指向index前面的结点
            pIndex->next->previous = pIndex->previous;
            
            free(pIndex);
        }
    }
    
    void insert(Node *pHeader, int index, int element){
        //首先获取index对应的结点的地址
        Node *pIndex = addressOfIndex(pHeader, index);
        if (pIndex == NULL) {
            printf("删除的元素不存在\n");
            exit(EXIT_FAILURE);
        } else{
            //在index的前面插入一个元素
            //为这个元素分配内存空间
            Node *pNew = createNode();
            if (pNew == NULL) {
                exit(EXIT_FAILURE);
            }else{
                pNew->age = element;
                
                //让new结点的next指针指向pIndex
                pNew->next = pIndex;
                
                //让new结点的previous指针指向index前面一个结点的地址
                pNew->previous = pIndex->previous;
                
                //让pIndex德previous指向pnew
                pIndex->previous = pNew;
                
                //让index前面的结点的next指向pNew
                pNew->previous->next = pNew;
            }
        }
    }
    
    int main(int argc, const char * argv[]) {
        
        //定义一个指针 指向头结点(头结点不存数据)
        Node *pHead = NULL;
        
        //创建头结点
        if (createHeader(&pHead) == false) {
            //创建头结点出错了。
            exit(EXIT_FAILURE);
        }
        
        //初始化这个双链表
        initial(pHead);
        
        show(pHead);
        
        delete(pHead, 3);
        
        show(pHead);
        
        insert(pHead, 2, 100);
        
        show(pHead);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:doubleLinkedList(双链表)

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