C/C++链表及其基本操作简单复现

最近一直在用python等,很久没写过C了hhh,,突然心血来潮,想要巩固下基础,写一波对于链表操作的简单复现,就当是一个练手或者复习吧,,对于链表使用不是很熟的xdm可以大致参照下,有问题也欢迎各位大佬批评指正

(本文以代码部分为主,详细的链表原理部分可移步至其它视频/文章,笔者也会考虑在以后有机会更一篇原理讲解hhh)

链表结构定义

这里均以最简单的结构(数据+地址指针)为例定义链表节点。

struct node{
    int data;	// 数据域
    node* next = nullptr;	// 指针域
};

// 创建节点head
node* head = new node;

求链表长度

// 链表长度
int node_length(node* head){
    node* p = head;
    int length = 0;
    while(p){
        length++;
        p = p->next;
    }
    
    return length;
}

尾插法插入元素

这里是直接封装成尾插函数,由于单链表在插入节点前需要确定前驱节点的位置,因而这里,如果要每次尾插入一个节点,都需要从头节点开始遍历至末尾确认当前前驱节点,时间复杂度为 O ( n ) O(n) O(n)

// 尾插法插入元素
void insert_at_tail(node* head, int dat){
    node* point = new node;
    point -> data = dat;
    node* p = head;
    while(p -> next != nullptr){
        p = p -> next;
    }
    
    p -> next = point;
    point -> next = nullptr;
}

头插法插入元素

不同于尾插法,头插法只需知道头节点的位置即可,直接将新节点插入头节点后继即可,时间复杂度为 O ( 1 ) O(1) O(1)

// 头插法插入元素
void insert_at_head(node* head, int dat){
    node* point = new node;
    point -> data = dat;
    // 若只有头节点,直接插入
    if(head -> next == nullptr){
        head -> next = point;
        point -> next = nullptr;
        return;
    }
    
    else{
        node* p = head -> next;
        point -> next = p;
        head -> next = point;
    }
}

指定位置插入元素

相对于前面插入方法,这里需要输入插入元素的位置信息。

// 在指定位置插入元素,loc为插入位置的索引
void insert_at_loc(node* head, int loc, int dat){

	// 插入位置合理性判断,这里用到了求链表长度函数
    if(loc < 0 || loc >= node_length(head)) return;
    
    node* p = head;
    for(int i = 0;i < loc;i++){
        p = p -> next;
    }
    
    node* point = new node;
    point -> data = dat;
    point -> next = p -> next;
    p -> next = point;
}

按值删除元素

若找到要删除的值,则在链表中删除该值对应节点,未找到则不做操作。

// 删除指定值元素, 若未找到指定值则原封不动
void delete_node(node* head, int dat){
    node* p = head;
    node* q = head -> next;
    
    while(q){
        if(q -> data == dat){
            p -> next = q -> next;
            delete(q);
            break;
        }
        
        else{
            if(q -> next == nullptr && q -> data != dat) return;
            p = p -> next;
            q = q -> next;
        }
    }
}

修改元素

将指定元素的节点值修改为新的指定值,若未找到指定元素则原封不动。

// 将指定元素的节点值修改为新的指定值,若未找到指定元素则原封不动
void revise(node* head, int src, int dst){
    node* p = head;
    while(p){
        if(p -> data == src){
            p -> data = dst;
            return;
        }
        
        else{
            if(p -> next == nullptr && p -> data != src) return;
            p = p -> next;
        }
    }
}

查找元素

输出指定元素值的位置,若未找到返回-1。

// 输出指定元素值的位置,若未找到返回-1
int find_node(node* head, int dat){
    if(head -> next == nullptr)return -1;
    node* p = head;
    int loc = 0;
    while(p){
        if(p -> data == dat)return loc;
        else{
            if(p -> next == nullptr && p -> data != dat) return -1;
            p = p -> next;
            loc++;
        }
    }
}

你可能感兴趣的:(C语言复习,链表,c语言,c++)