【2019暑假刷题笔记-链表】总结自《算法笔记》

本文深入讲解链表数据结构的创建、查找、插入、删除等基本操作,并对比C和C++中的内存管理方法,同时介绍了静态链表的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目  录

一、创建链表节点

二、创建链表

三、创建链表

四、查找元素

五、插入元素 

 六、删除元素

七、静态链表


一、创建链表节点

/*
struct node{
    typename data;   //数据域
    node* next;    //指针域
};

选择带头结点的链表

*/

struct node{
    int x;
    node* next;
}

二、创建链表

  1. (C语言)malloc与free:
    /*
    
    在头文件#include <stdlib.h>申请一个内容空间
    
    typename* p=(typename*)malloc(sizeof(typename));
    
    但是malloc(sizeof(typename))返回的是未确定类型的指针void*,所以要加上装置类型转换(*typename)
    
    free(p) 释放空间
    */
    
    int* p=(int*)malloc(sizeof(int));
    
    free(p);
    
    /*
    
    如果失败,返回空指针NULL并赋值给p
    
    如,int* p=(node*)malloc(100000000*sizeof(node*));  可能会申请空间失败
    
    */

     

  2. (C++)new与delete:
    /*
    
    new是C++中用来申请动态空间的运算符
    
    typename* p=new typename;
    
    delete(p);是与new一同使用的,方式内存泄露
    
    */
    
    node* p=new node;
    delete(p);

     

三、创建链表

node* create(int arr[]){
    node *p,*pre,*head;  //pre保存当前结点的前驱结点,head为头结点
    node* head = new node;
    head->next=null;
    pre = head;
    for(int i=0;i<arr.length();i++){  //创建链表五步走
        node* p = new node;  //第一步:申请一个内存空间
        p->data = arr[i];  //第二步:将数据赋值给结点的数值域
        p->next = null;  //第三步:操作新结点的左边,将新结点p->next赋值为null
        pre->next = p;  //第四步:操作新结点的右边,将前驱结点的next指针指向p
        pre=p;    //第五步:把新结点设置为前驱结点
    }
    return head;
}

/*引用方式*/

node* L = create(arr);  //arr是数组
L = L->next;  //L因为第一个结点是空结点head,所以需要有数值域需要将指针后移
while(L!=NULL){
    printf("%d",L->data);
    L = L->next;  //移动指针
}

四、查找元素

/*比如查找所要的数的个数*/

int search(node* head,int x){  //需要一个链表和查找的数
    int count = 0;  //计数器为0
    node* p = head->next;
    while(p!=null){
        if(p->data==x){  //值相等,计数器+1
            count++;
        }
        p->next;  //指针向后挪一位
    }
    return count;
}

五、插入元素 

/*比如插入一个数x*/

void search(node* head,int pos,int x){  //需要一个链表、插入的位置和插入的数
    node* p = head;
    for(int i=0;i<pos-1;i++){  //移动指针到需要插入位置的前一个位置
        p->next;
    }
    node* q = new node; //申请一个新的结点
    q->data = x;
    q->next = p->next;
    p->next = q;
}

 六、删除元素

void delete(node* head,int x){  //需要一个链表和删除的数
    node* p = head->next;  //p从第一个点开始枚举
    node* pre = head;    //pre始终指向前一个结点,因为需要前一个结点的->next指向删除结点的后一个结点,p是pre的后一个结点,pre是p的前一个结点
    while(p!=null){
        if(p->data==x){  //找到要删除的元素了
            pre->next = p->next; //删除结点的next指向的结点赋值给删除结点前一个结点的next
            delete(p);
            p=pre->next;  //p指针后移一位
        }else{  //若不是,两个指针后移
            pre = p;
            p = p->next;
        }
    }
}

七、静态链表

若结点数是较小的整数,可以采用静态链表。其实现的原理是hash,即通过建立一个结构体,并领数组的下标直接表示结点的地址,以达到直接访问数组中元素就能访问结点的效果,银外由于结点的访问非常方便,因此静态结点不需要头结点的。

struct Node{
    int data;  //数据类型随意
    int next;
}node[size];

/*
如果初始结点的地址是11111,第二个结点的地址是22222,第三个节点是33333,且第三个结点为链表的末尾,那么,整个静态链表的结点就可以通过下面的写法实现

node[111111].next = 222222;
node[222222].next = 333333;
node[333333].next = -1;
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_之桐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值