首页 > 其他分享 >数据结构记录-链表

数据结构记录-链表

时间:2023-11-04 13:33:21浏览次数:46  
标签:return temp 记录 int elem next 链表 link 数据结构

1、单链表

1、单链表的组成

最基本的单链表组成如下:

typedef struct Link
{
    char elem; /*数据域*/
    struct Link *next; /*指针域*/
}link;/*节点名,每个阶段都是一个Link结构体*/

为什么这样的就是链表呢,需要从这个结构体内部组成来看,struct Link next; 定义了一个指针变量 next,它的类型是 struct Link,即指向 struct Link 结构体的指针,所以它可以执行一个这样的结构体,所以可以指向下一个结构体,只要我们每次都指一下就会这样一直循环不断下去,这样就形成一个链表。

2、单链表实现

创建一个最简单的单链表如下所示:

link *initLink() 
{
    /*创建无头结点*/
    // link *p = NULL;
    // link *temp = (link*)malloc(sizeof(link));

    // temp->elem = 1;
    // temp->next = NULL;

    // p = temp;

    // for(int i = 2; i<5; i++)
    // {
    //     link *a = (link*)malloc(sizeof(link));
    //     a->elem = i;
    //     a->next = NULL;

    //     temp->next = a;
    //     temp = temp->next; /*这样循环创建后驱*/
    // }

    /*创建有头结点*/

    link *p = (link*)malloc(sizeof(link));
    link *temp = p; /*声明一个指针指向头结点*/

    for(int i = 1; i<5; i++)
    {
        link *a = (link*)malloc(sizeof(link));
        a->elem = i;
        a->next = NULL;

        temp->next = a;
        temp = temp->next; /*这样循环创建后驱*/
    }

    return p;
}

最关键的代码在这:
temp->next = a;
temp = temp->next;

从循环来看,第一次循环,数据域赋值为1,temp的第一个next指向这个新申请的a,之后temp更新到a这里,之后继续创建数据域为2的,在执行相同操作,这样一直到4结束。

但是这样链表的第一个元素,数据域是空的,因为没有地方给他赋值,图示上是这样的
image

3、单链表的基本操作

插入元素

插入如下图所示,就是先移动到他前面一个节点,之后修改next指针的指向。
image

/*
插入元素:
1、将新节点的next指针指向插入位置后的节点
2、将插入位置前节点的next指针指向插入节点

[param] elem 新数据
[param] add 插入位置
*/
link *insertElem(link *p, int elem, int add)
{
    link *temp = p;

    for(int i = 1; i<add; i++) /*将temp指针指向要插入的前一个节点*/
    {
        temp = temp->next;
        if(temp == NULL)
        {
            printf("插入位置无效\n");
            return p;
        }
    }

    link *c = (link*)malloc(sizeof(link));
    c->elem = elem;
    c->next = temp->next; /*创建一个新节点,将c的next指向temp的next,再把temp的next指向c*/
    temp->next = c;
    return p;
}

删除元素

和插入类似,找到,之后指向下一个的下一个。

/*
删除元素:
1、将节点从链表中摘除
2、手动释放节点

[param] elem 要删除元素的值
*/
link *delElem(link *p, int add)
{
    link *temp = p;
    for(int i=1;i<add;i++) /*移动到要删除的上一个节点*/
    {
        temp = temp->next;
        if(temp->next == NULL)
        {
            printf("删除位置无效\n");
            return p;
        }
    }
    link *del = temp->next;
    temp->next = temp->next->next; /*指向下一个节点是下一个的下一个*/
    free(del);
    return p;
}

寻找元素

int selectElem(link *p, int elem)
{
    link *t = p;

    int i=1;
    while (t->next)
    {
        t=t->next;
        if(t->elem == elem)
            return i;
        i++;
    }
    return -1;
}

link *amendElem(link *p, int add, int newElem)
{
    link *temp = p;
    temp = temp->next;
    for(int i=1; i<add;i++)
    {
        temp = temp->next;
    }
    temp->elem = newElem;
    return p;
}

修改元素

link *amendElem(link *p, int add, int newElem)
{
    link *temp = p;
    temp = temp->next;
    for(int i=1; i<add;i++)
    {
        temp = temp->next;
    }
    temp->elem = newElem;
    return p;
}

标签:return,temp,记录,int,elem,next,链表,link,数据结构
From: https://www.cnblogs.com/lx2035/p/17808749.html

相关文章

  • STM32 PWM控制LED流水灯 学习记录随笔
    代码部分#include"stm32f10x.h"                 //Deviceheader#include"Delay.h"intmain(void){   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//启用系统寄存器时钟,使能GPIOC组,并启动   GPIO_InitTypeDefGPIO_InitStructure;  ......
  • 栈:数据结构中的后进先出(LIFO)容器
    栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问。栈遵循后进先出(LastIn,FirstOut,LIFO)原则,即最后放入栈的元素首先被取出。这种数据结构模拟了物理世界中的栈,如一堆书或一摞盘子。栈的概念栈是一个线性数据结构,具有以下关键特点:后进先出(LIFO)......
  • 07_环形链表
    环形链表给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 顺序表和链表
    writeup后面写258.链表去重给定一个键值为整数的单链表L,将键值的绝对值有重复的结点删除:即对任意键值K,只有键值或其绝对值等于K的第一个结点被保留在L中。例如,下面单链表L包含键值21、-15、15、7、-15,如下图(a)所示;去重后的链表L包含键值21、-15、7,如......
  • stm32学习记录随笔23.11.3
    RCC外设时钟使能常用函数//标准库文件->stm32f10x_rcc.hvoidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);//RCC_AHB外设时钟控制voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);//RCC_APB2外设时钟控制void......
  • 2023 ABC做题记录
    AGC037F题目传送门第一步,考虑判断序列是否合法。通过对于属于等级$k$的定义将定义反推:$s$中最小的元素$x$,找到所有$x$的连续段。设一个连续段的长度是$len$,若$len<l$则不合法,否则将这一段合并为$\lfloor\frac{len}l\rfloor$个$x+1$,直到$s$中只剩下一种元......
  • 运动记录(2023年11月)
    日期仰卧起坐俯卧撑深蹲2023年11月3日50+505030                    ......
  • 计算机数据结构
    数据结构一数据结构的物理存储结构只有两种:顺序存储和链式存储(像栈、队列、树、堆、图等都是从逻辑结构去抽象的映射到内存中,也是这两种物理组织形式)。二顺序存储如数组连续的固定长度的空间,通过下标就能快速找到。链式存储如二叉树、B树等,底层可能是不连......
  • AFO后做题记录1
    [ABC240Ex]SequenceofSubstrings考题T3,菜飞,显然把所有串搞出来之后DP,\(dp[i]\)表示\(1-i\)的字符的答案,能推出:\(dp[r[i]]=max(dp[r[i]],max(dp[1-l[i]])+1)\),显然能用数据结构优化到\(nlogn\),那么现在如何去把子串搞出来,对于每一个后缀建trie,考虑最优情况下一个串最大......
  • 对一些不错的题的记录
    arc167C不会,看完题解感觉好妙,还是有很多不足。先对ai进行排序,容易发现排完序后并没有什么坏的影响,反而相当于少了一次映射。现在只要求出每条边的贡献即可,但是直接算贡献的话发现非常困难,这时可以考虑类似kruskal的思想,从小到大枚举到新的权值时,即在原图中加上一些这个权值的......