首页 > 其他分享 >【数据结构】线性表

【数据结构】线性表

时间:2023-10-02 13:02:15浏览次数:37  
标签:node 线性表 list next 数据结构 data 节点 LNode



线性表

  • 顺序表
  • 链式存储
  • 单链表
  • 双链表


知识目录

【数据结构】线性表_c#

顺序表

  • 概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。
  • 特点:逻辑上相邻的数据元素,物理次序也是相邻的。

只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。


定义以及初始化

#define MaxSize 50//顺序表的最大长度
typedef char ElemType;
typedef struct
{
    ElemType data[MaxSize];//顺序表的元素
    int length;//顺序表的当前长度
}SqList;

//初始化顺序表
void InitList(SqList *l){
    l->length = 0;//长度赋值为0
}

顺序表的插入操作

bool ListInsert(SqList *l,int i,ElemType e){//参数分别是:顺序表、插入的位置以及插入的元素
    //判断i的范围是否有效
    if (i<1||i>l->length+1)
        return false;
    //当前存储空间已满,不能插入
    if (l->length>=MaxSize)
        return false;
    //将第i个以及之后的元素后移
    for (int j = l->length; j >= i; j--)
    {
        l->data[j] = l->data[j-1];
    }
    l->data[i-1] = e;//赋值
    l->length = l->length + 1;//顺序表的长度+1
    return true;
}

删除操作

bool ListDelect(SqList *list,int i){
    //判断i的合法性
    if(i<1||i>list->length+1) return false;
    for(int j = i;j<=list->length;j++)//将第i后的元素前移
        list->data[j-1]=list->data[j];
    list->length--;//长度自减1
    return true;
}

按值查找,返回第一个位置

int locateElem(SqList list,ElemType e){//
    for (int j = 0; j < list.length; j++)
    {
        if (list.data[j]==e) return j+1;
    }
    return 0;//没有找到
}

按位查找

ElemType GetElem(SqList list,int i){
    return list.data[i-1];
}

按照顺序输出元素

void PrintList(SqList l){
    for (int i = 0; i < l.length; i++)
    {
         printf("%c\n",l.data[i]);
    }
    printf("************************\n");
}

链式存储

单链表

初始化

typedef char ElemType;

typedef struct LNode
{
    ElemType data;//data域
    struct LNode* next;//指针域
}LNode;

//初始化链表
void InitLNode(LNode *node){
    node = (LNode*)malloc(sizeof(LNode));//初始化新的node节点
    node->data = NULL;//给数值赋予初值
    node->next = NULL;//赋予下一个结点的指针
}

【数据结构】线性表_数据结构_02

头插法

//头插法插入节点
bool LNodeHeadInsert(LNode* node,ElemType e){
    LNode* tempNode = (LNode*)malloc(sizeof(LNode));//开辟新的空间
    tempNode->data = e;//存储值
    tempNode->next = node->next;//指向第一个节点
    node->next = tempNode;//将头节点的下一个指针指向新的第一个节点
    return true;
}

尾插法

//尾插法插入
bool LNodeTailInsert(LNode* list,ElemType e){
    LNode* node = (LNode*)malloc(sizeof(LNode));//开辟空间,新建节点
    node->data = e;//data给到新建节点的数据域
    node->next = NULL;//新建节点指向NULL
    while(list->next)//寻找最后一个节点
    {
        list=list->next;
    }
    list->next=node;//最后一个节点指向新建节点
    return true;
}

删除

【数据结构】线性表_顺序表_03

//删除
void LNodedelete(LNode* list,ElemType data)//删除
{
    LNode* pre=list;//保存头节点,它是current的前一个节点
    LNode* current=list->next;//保存第一个节点开始,从它开始遍历
    while(current)//遍历,可使用头节点data进行for循环遍历
    {
        if(current->data==data)//找到data
        {
            pre->next=current->next;//将前一个节点指向要要删除节点的下一个节点
            free(current);//释放要铲除节点的堆内存空间
            break;//退出循环
        }
        pre = current;//未找到data则往后继续遍历
        current = current->next;//未找到data则往后继续遍历
    }
}

双链表

初始化

【数据结构】线性表_windows_04

typedef char ElemType;
//定义结点信息 
typedef struct DNode{
	struct DNode *prior;
	ElemType data;
	struct DNode *next;
}DNode; 

void InitDNode(DNode *node){
    node = (DNode*)malloc(sizeof(DNode));//开辟空间
    node->data = NULL;
    node->prior = NULL;
    node->next = NULL;
}

添加节点

【数据结构】线性表_windows_05

//增加节点
void DNodeInsert(DNode *node,ElemType e){
    DNode *l = (DNode*)malloc(sizeof(DNode));//开辟空间
    l->data = e;
    l->next = node->next;
    node->next->prior = l;
    l->prior = node;
    node->next = l;
}

删除

【数据结构】线性表_c#_06

//删除节点
void DNodeDelete(DNode *node,ElemType e){
    while (node->next)
    {
        if (node->data==e)
        {
           node->prior->next = node->next;
           node->next->prior = node->prior;
           break;
        }
        node = node->next;
    }
}


标签:node,线性表,list,next,数据结构,data,节点,LNode
From: https://blog.51cto.com/u_15320818/7683418

相关文章

  • 【数据结构】栈、队列和数组
    栈、队列和数组栈队列数组数组的顺序表示和实现顺序表中查找和修改数组元素矩阵的压缩存储特殊矩阵稀疏矩阵栈初始化#defineMaxSize50//栈中元素的最大个数typedefcharElemType;//数据结构typedefstruct{inttop;//栈顶指针ElemTypedata[MaxSize];//存放栈中......
  • 深入理解算法与数据结构
    ......
  • Redis数据结构
    本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。前言本文主要介绍关于Redis的五种基本数据结构的底层实现原理,然后来分析我们常用的使用场景。先简单回顾一下知识点。Redis是一个开源(BSD许可)的,内存中的数据结......
  • C++常见算法&数据结构模版
    各种常见算法&数据结构模板1.最长不下降子序列(LIS)1.1\(O(n^2)\)做法点击查看代码for(inti=1;i<=n;i++){ cin>>a[i]; dp[i]=1; } for(inti=1;i<=n;i++){ for(intj=1;j<i;j++){ if(a[i]>a[j]){ dp[i]=max(dp[i],dp[j]+......
  • Go每日一库之155:go-spew(输出 Go 数据结构)
    对于应用的调试,我们经常会使用fmt.Println来输出关键变量的数据。或者使用log库,将数据以log的形式输出。对于基础数据类型,上面两种方法都可以比较方便地满足需求。对于一些结构体类型数据,通常我们可以先将其序列化后再输出。如果结构体中包含不可序列化的字段,比如func类型......
  • 【数据结构】线性表的数组描述和链式描述
    1.线性表抽象类#pragmaoncetemplate<classT>classLinearList{public://线性表是否为空virtualboolempty()const=0;//线性表大小virtualintsize()const=0;//根据ID获取线性表元素virtualT&get(inttheIndex)const=0;......
  • 数据结构总结
    数据结构数组array·数组有维度之分,是十分重要的数据结构,最简单的数组是一维数组,其逻辑结构为线性表.·数组的特点:插入删除是$O(n)$的,但是可以随机下标访问.STL中的可变长度数组vector基础操作<vector>vector<int>v;vector<int>::iteratorit;v.pus......
  • Python笔记:基本数据结构(容器)的优化
    列表的性能问题队列的弹出问题利用Python的原生语法很难写出一个真正完全能达到\(O(1)\)的队列,究其原因是由于insert方法的时间复杂度问题:classqueue: def__init__(self,q): self.q=[] defpopright(self): self.q.pop() defappendleft(self,elem): self.q.ins......
  • 浅谈数据结构栈与队列
    栈1.栈的基本概念栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。不能插入和删除的一端为栈底(Bottom)栈顶(top):线性表允许进行插入删除的那一端栈底(bottom):固定的,不允许进行插入和删除的那一端空栈:不含任何元素的......
  • 数据结构---字符串
    数据结构---字符串串的定义串是由零个或多个字符顺序排列组成的有限序列空串长度为零的串空白串由一个或多个空格组成的串字符串匹配问题朴素模式匹配模式匹配的查找过程(Find):给定两个字符串变量S和P,其中目标S有n个字符,模式P有m个字符,m<=n。从S的给定位置(通常为S的第......