链表

100 阅读2分钟

链表

//定义节点数据类型
struct LinkNode{
    int data;
    struct LinkNode *next;
};
//创建新节点
struct LinkNode *Construct_NewNode();

//初始化链表
struct LinkNode *Init_Linklist();

//遍历输出链表
void Foreach_LinkList(struct LinkNode *header);

//在链表中的olddata处插入节点
void InsertByValue_Linklist(struct LinkNode *header,int olddata,int newdata);

//清空(只剩一个头节点)
void Clear_LinkList(struct LinkNode *header);

//在链表中删除节点
void RemoveByValue_LinkList(struct LinkNode *header,int deldata);

//销毁(与清空相似,清空留下一个头节点,销毁把头节点也删除了)
void Destroy_LinkList(struct LinkNode *header);

//创建新节点
struct LinkNode *Construct_NewNode(){
    struct LinkNode *newnode=malloc(sizeof(struct LinkNode));
    newnode->data=-1;
    newnode->next=NULL;
    return newnode;
}

//初始化链表
struct LinkNode *Init_Linklist(){
    //创建头节点
    struct LinkNode *header=Construct_NewNode();
    
    //创建尾部指针
    struct LinkNode *pRear=header;
    
    //插入节点
    int value=-1;
    while(true){
        scanf("%d",&value);
        if(value==-1){
            break;
        }
        //创建新节点
        struct LinkNode *newnode=Construct_NewNode();
        newnode->data=value;
        //新节点插入到链表中
        pRear->next=newnode;
        //更新尾部指针指向
        pRear=newcode;
    }
    return header;
}

//遍历输出链表
void Foreach_LinkList(struct LinkNode *header){
    if(header==NULL){
            return;
    }
    
    //设置辅助指针变量
    struct LinkNode *pcurrent=header->next;
    
    while(pcurrent){
        printf("%d",pcurrent->data);
        pcurrent=pcurrent->next;
    }
}

//在链表中的olddata处插入节点(若没有olddata就在链表最末尾插入)
void InsertByValue_Linklist(struct LinkNode *header,int olddata,int newdata){
    if(header==NULL){
        return;
    }
    
    //设置两个辅助指针变量
    struct LinkNode *pPrev=header;
    struct LinkNode *pCurrent=pPrev->next;
    
    while(pCurrent){
        if(pCurrent->data==olddata){
            break;
        }
        //移动两个辅助指针
        pPrev=pCurrent;
        pCurrent=pCurrent->next;
    }
    
    //如果pCurrent为空,说明链表中不存在值为olddata的节点
    //if(pCurrent==NULL){
        //return;
    //}
    
    //创建新节点
    struct LinkNode *newnode=Construct_NewNode();
    newnode->data=newdata;
    
    //新节点插入到链表中
    newnode->next=pCurrent;
    pPrev->next=newnode;
}

//清空(只剩一个头节点)
void Clear_LinkList(struct LinkNode *header){
    if(header==NULL){
        return;
    }
    
    //设置辅助指针变量
    struct LinkNode *pCurrent=header->next;
    
    while(pCurrent){
        //先保存下个节点地址
        struct LinkNode *pNext=pCurrent->next;
        //释放当前节点内容
        free(pCurrent);
        //pCurrent指向下一个节点
        pCurrent=pnext;
    }
    header->next=NULL;
}

//在链表中删除节点
void RemoveByValue_LinkList(struct LinkNode *header,int deldata){
    if(header==NULL){
        return;
    }
    
    //设置两个辅助指针变量
    struct LinkNode *pPrev=header;
    struct LinkNode *pCurrent=pPrev->next;
    
    while(pCurrent){
        if(pCurrent->data==deldata){
            break;
        }
        //移动两个辅助指针
        pPrev=pCurrent;
        pCurrent=pCurrent->next;
    }
    if(pCurrent==NULL){
        return;
    }
    
    //重新建立待删除节点的前驱和后继节点关系
    pPrev->next=pCurrent->next;
    
    //释放待删除节点内存
    free(pCurrent);
}

//销毁(与清空链表相似,清空留下一个头节点,销毁把头节点也删除了)
void Destroy_LinkList(struct LinkNode *header){
    if(header==NULL){
        return;
    }
   
    //设置辅助指针变量
    struct LinkNode *pCurrent=header;
    
    while(pCurrent){
        //先保存下个节点地址
        struct LinkNode *pNext=pCurrent->next;
        //释放当前节点内容
        free(pCurrent);
        //pCurrent指向下一个节点
        pCurrent=pNext;
    }
}