单链表的简单操作

初始化链表

LinkNode* CreateNode(LinkType x){
        LinkNode* ptr = (LinkNode*)malloc(sizeof(x));
        ptr -> value = x;
        ptr ->next = NULL;
        return ptr;
}

创建一个新结点

void LinkInit(LinkNode** head){
        if(head == NULL){
                return;
        }
        *head = NULL;
}

销毁一个结点

void DestroyNode(LinkNode* ptr){
        free(ptr);
}

尾插

void LinkPushBack(LinkNode** head,LinkType x){
        if(head == NULL){
                return;
        }
        if(*head == NULL){
                *head = CreateNode(x);
        }else{
                LinkNode* cur = *head;
            while(cur->next != NULL){
                        cur = cur->next;
            }
            LinkNode* newnode = CreateNode(x);
            cur->next = newnode;
        }
}

尾删

void LinkPopBack(LinkNode** head){
        if(head == NULL || *head == NULL){
                return;
        }
        LinkNode* pos = *head;
        while(pos->next->next != NULL){
                pos = pos->next;
        }

        DestroyNode(pos->next);
        pos->next = NULL;

}

头插

void LinkPushFront(LinkNode** head,LinkType x){
        if(head == NULL){
                return;
        }
        LinkNode* newnode = CreateNode(x);
        if(*head == NULL){
                *head = newnode;
        }else{
                newnode->next = (*head);
        }
        *head = newnode;
}

头删

void LinkPopFront(LinkNode** head){
        if(head == NULL || *head == NULL){
                return;
        }
        LinkNode* ptr = *head;
        *head = (*head)->next;
        DestroyNode(ptr);
}

查找链表中某字符的位置

LinkNode* LinkFind(LinkNode** head,LinkType x){
        if(*head == NULL || head == NULL){
                return;
        }
        LinkNode* ptr = *head;
        while((ptr->value != x) && (ptr != NULL)){
                ptr = ptr->next;
        }
        if(ptr->value == x){
                return ptr;
        }else{
                return NULL;
        }

}

在指定位置的前面插入

void LinkInsertBeforePos(LinkNode* head,LinkNode* pos,LinkType x){
        if(head == NULL){
                return;
        }
        LinkNode* ptr = head;
        LinkNode* newnode = CreateNode(x);
        while(ptr->next != pos){
                ptr = ptr->next;
        }
        newnode->next = pos;
        ptr->next = newnode;

}

在指定位置的后面插入

void LinkInsertAfterPos(LinkNode* head,LinkNode* pos,LinkType x){
        if(head == NULL){
                return;
        }
        LinkNode* newnode = CreateNode(x);
        LinkNode* ptr = head;
        while(ptr != pos){
                ptr = ptr->next;
        }
        newnode->next = ptr->next;
        ptr->next = newnode;
}

删除指定位置

void LinkDeletePos(LinkNode* head,LinkNode* pos){
        if(head == NULL){
                return;
        }
        LinkNode* pos_prev = head;
        while(pos_prev->next != pos){
                pos_prev = pos_prev->next;
        }
        LinkNode* pos_next = pos->next;
        pos_prev->next = pos_next;
        DestroyNode(pos);
}

删除指定值

void LinkDeleteValue(LinkNode* head,LinkType to_delete){
        if(head == NULL){
                return;
        }
        if(head->value == to_delete){
                LinkPopFront(&head);
                return;
        }
        LinkNode* prev = head;
        while(prev->next->value != to_delete){
                prev = prev->next;
        }
        if(prev->next->next == NULL){
                LinkPopBack(&head);
        }else{
        LinkNode* todelete = prev->next;
        LinkNode* posnext = prev->next->next;
        prev->next = posnext;
        DestroyNode(todelete);
        }
}

删除指定的所有值

void LinkDeleteValueAll(LinkNode* head,LinkType to_delete){

        if(head == NULL){
                return;
        }
        if(head->value == to_delete){
                LinkPopFront(&head);
                return;
        }
        LinkNode* prev = head;
        while(prev->next->value != to_delete){
                prev = prev->next;
        }
        if(prev->next->next == NULL){
                LinkPopBack(&head);
                return;
        }else{
                LinkNode* todelete = prev->next;
                LinkNode* posnext = prev->next->next;
                prev->next = posnext;
                DestroyNode(todelete);
                LinkDeleteValueAll(posnext,to_delete);
        }


}

链表逆置

void Reverse(LinkNode** head){
        LinkNode* prev;
        LinkNode* middle = *head;
        LinkNode* next = (*head)->next;
        while(middle != NULL){
                if(next == NULL){
                        middle->next = prev;
                        *head = middle;
                        break;
                }
                middle->next = prev;
                prev = middle;
                middle = next;
                next = next->next;
        }
}

在指定位置前插入值(不遍历链表)

void InsertBefore(LinkNode** head,LinkNode* pos,LinkType x){
        if(head == NULL){
                return;
        }
        LinkNode* newnode = CreateNode(x);
        if((*head)->next == NULL){
                newnode->next = (*head);
                (*head) = newnode;

        }else{
                LinkNode* pos_next = pos->next;
                Swap(newnode,pos);
                pos->next = newnode;
                newnode->next = pos_next;
        }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值