美文网首页
链表常见操作

链表常见操作

作者: km15 | 来源:发表于2020-02-17 19:19 被阅读0次

7.3.1 链表的概念
1、链表的结构

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

又分为带头结点和不带头结点,头结点一般称为head,data不存放任何内容,next指向第一个数据域有内容的东西

7.3.2使用malloc函数或new运算符为节点分配内存空间

1、使用malloc函数或new运算符为链表节点分配空间(推荐用new)
(1)maloc是c语言中stdlib.h用于申请动态内存的函数,返回类型是申请void类型的指针,参数是size_t,所以需要sizeof(int)之类的,然后再强制转换
申请失败返回空指针null
一般不会失败,申请太大以及无限申请的情况除外

2、new运算符
c++用来申请动态空间的运算符,返回类型同样是申请的同变量类型的指针;
写法:int *p = new int; 即 new + 类型名;
如果失败会启动异常机制,而不是返回NULL,同样,失败可能是申请太大空间

3、内存泄漏
(1)free(p) 同样在stdlib.h头文件下
实现两个效果:将指针变量p所指空间释放,同时将p指向Null

(2) delete(p)
实现效果与free一样

切记,必须成对出现,在一般考试例,分配的空间在程序结束时即被释放,并且内存大小一般够一道题使用,但是,从编程习惯上!一定要成对出现

4、链表的基本操作

1、创建链表

struct node{
    int date;
    node *next; // 指针域
};
记忆:三个指针,头指针,循环复制

//创建链表
void create(int array[]){
    node *p, *pre, *head;   //  pre保存当前节点的前驱节点,head为头结点
    head = new node;    //  创建头结点
    head->next = null;  //头结点不需要数据域,指针域置为null
    pre = head; //记录pre为head
    for(int i = 0;i < 5;i++){
        p = new head;   //创建节点
        //将array[i]赋值给新建的节点作为数据域,也可以scanf输入
        p -> data = array[i];
        p->next = null; //将新节点的指针域设置为null
        pre->next = p;  //前驱节点的指针域设为当前节点的地址
        p = pre;    //将pre设为p,作为下个节点的前驱节点
    }
    return head;    //返回头结点指针
}

2、查找元素

查找有多少个x
记忆:计算器+while循环

int search(node *head,int x){
    int count = 0;  //计数器
    node *p = head->next;   //从第一个节点开始
    while(p != null){   //只要没到链表结尾
        if(p->date == x){   //当前节点的数据域为x,则count++
            count++;
        }
        p = p->next;    //指针移动到下一个节点
    }
    return count;
}

3、插入元素
x插入第3个位置,其实就是插入完成后,第三个元素位置是x

记忆:head开始,for循环找前位,创节点,改指针

void insert(node *head, int pos,int x){
    node *p = head;
    for(int i = 0;i < pos - 1;++I){
        p = p->next;    //pos - 1是为了到前一个节点
    }
    node *q = new node;
    p->data = x;    //新节点的数据域为x
    q->next = p->next;  //新节点的下一个节点指向原先插入位置的节点
    p->next = q;    //前一个位置的节点指向新节点
}

4、删除元素
思想:
第一点,存前驱,while循环,改指针;(否则移)

void del(node* head, int x){
    node *p = head->next;   //从第一个结点开始
    node *pre = head;   //per始终保存p的前驱节点的指针
    while(p != null){
        if(p->data == x){
            pre->next = p->next;
            delete(p);
            p = pre->next;
        }else{
            pre = p;
            p = p->next;
        }
    }
}

7.3.4 静态链表
静态链表
struct Node{
    typename data;
    int next;   //指针域
}node;

注意:next是一个int型整数,存放下一个节点的地址
结构体类型名和结构体名字设成了不同,一般是可以相同的,但是有可能对他们排序,这时候相同sort就会编译错,所以不同

相关文章

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

  • 链表常见操作

  • 链表常见操作

    7.3.1 链表的概念1、链表的结构 又分为带头结点和不带头结点,头结点一般称为head,data不存放任何内容,...

  • Java常用类库与技巧-集合

    一 数据结构常见问题 数组和链表的区别;链表的操作,如反转,链表环路检测,双向链表,循环链表相关操作;队列,栈的应...

  • 常见的链表操作

    单链表反转 思路 迭代:在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点...

  • 链表

    链表和数组一样也支持查找,插入,删除操作。最常见的三种链表是:单链表,双链表和循环链表。 链表和数组的区别:数组需...

  • 链表(Java)

    链表常见的操作: 1、插入节点(头插、尾插)2、删除节点3、获取链表长度4、逆序打印5、反转链表6、判断链表是否有...

  • 链表结束篇:链表的五种常见操作

    链表结束篇:链表的五种常见操作 单链表翻转 检测一个链表中是否有环 两个有序的链表合并 删除链表倒数第 n 个结点...

  • Lecture05

    Equals() & Hashcode()方法 ADT的定义及单向链表的常见操作(addToFront()、add...

  • 链表算法面试问题看我就够了!(转载)

    1 引言 单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目。 本文大概...

网友评论

      本文标题:链表常见操作

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