数据结构 线性表部分代码(c)

专插本数据结构第二章2.4线性表顺序存储表示 这是一个广东专插本菜鸡写的数据结构,代码写的不好,希望能给像我这样的小白看懂,因为从鹏哥的C语言突然转到王卓的数据结构类C语言有点看不懂,琢磨了好久,希望大佬能给点指正,谢谢了。 阅读详情


文章仅个人学习数据结构的实现记录,对理论性文字很少,仅仅粘贴实现的c代码以及部分测试,其中测试结果无说明

顺序表

malloc函数分配的空间是在堆区,需要程序员自行回收(free)

  • 初始化顺序表的实现——静态结构
    这里要注意指针的使用
/*
This is a define of sequence
*/

#include<stdio.h>
#define MaxSize 10 // the max size

// Describe the sequence
typedef struct{
    int data[MaxSize]; // this are elements
    int length;// the real size
}SqList;

// Init
void InitList(SqList *L){
    for(int i=0;i<MaxSize;i++){
        L->data[i]=0;
    }
    // set the real size
    L->length=0;
}

int main(){
    SqList s;
    // &s:it is an address
    InitList(&s);
    s.data[0]=1;
    s.length++;
    for(int i=0;i<s.length;i++){
        printf("%d\n",s.data[i]);
    }
}
  • 插入——健壮性
// Insert
bool ListInsert(SqList *L,int i,int e){
    // this index is not legal;tips:i means 位序, not the index
    if((i-1)<0||(i-1)>L->length)
        return false;
    // there is no position you can insert into
    if(L->length>=MaxSize)
        return false;

    // TODO if e is not legal

    for(int j=L->length-1;j>=(i-1);j--){
        L->data[j+1]=L->data[j];
    }
    L->data[i-1]=e;
    L->length++;
    return true;
}
  • 删除
// Delete
bool ListDelete(SqList *L,int i,int *e){
    // this index is not legal;tips:i means 位序, not the index
    if((i-1)<0||(i-1)>L->length)
        return false;

    *e=L->data[i-1];
    // move the element to the next position(while index>i)
    for(int j=i-1;j<L->length;j++){
        L->data[j]=L->data[j+1];
    }
    
    L->length--;
    return true;
}
  • 按照下标查找
// find by index
int GetElem(SqList L,int i){
    if((i-1)<0||(i-1)>L.length)
        return -1;
    return L.data[i-1];
}
  • 按照元素查找
// find by element
int LocateElem(SqList L,int e){
    for(int i=0;i<L.length;i++){
        if(L.data[i]==e){
            return i+1;
        }
    }
    return -1;
}

单链表

  • 单链表的定义(是否带头结点)
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

// linklist
// define linklist 
typedef struct LNote{
    int data;
    struct LNode *next;
}LNode,*LinkList;//重命名数据类型为LNode,并且重命名其指针为LinkList,当说明的是LNode* 的时候,表明这是一个节点,当写的是LinkList的时候,说明这是一个单链表

// init
bool InitList_withoutHead(LinkList *L){
    // NULL:avoid dirty data
    (*L)=NULL;
    return true;
}
bool InitList_withHead(LinkList *L){
    *L=(LNode *)malloc(sizeof(LNode));
    if(*L==NULL)
        return false;
    (*L)->next=NULL;
    return true;
}

// judge
bool Empty(LinkList L){
    if(L==NULL)
        return true;
    else
        return false;
}
  • 单链表的插入——按位序插入(带头结点)
// Insert
bool Listinsert_withHead(LinkList *L,int i,int e){
    // i means 位序
    if(i<1)
        return false;
    LNode *p;//指针p指向当前扫描到的节点
    int j=0;// 当前p指向的是第几个节点,这里指向的是头结点,认为是0节点
    p=(*L);
    // p->data=1111;
    // printf("%d\n",p->data);
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    // i is not legal
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;// 这两句次序不可以改变
    p->next=s;
    return true;
}

// test
void test1(){
   LinkList L;
    // L做头结点
    InitList_withHead(&L);
    Listinsert_withHead(&L,1,11);
    Listinsert_withHead(&L,2,22);
    Listinsert_withHead(&L,3,33);
    LNode *p=L->next;
    while(p!=NULL){
        printf("%d\n",p->data);
        p=p->next;
    }
}
  • 单链表的插入——按位序插入(不带头结点)

    这个时候,当n=1的时候,需要特别使用一段代码来实现,特别麻烦

bool Listinsert_withoutHead(LinkList *L,int i,int e){
    if(i<1)
        return false;
    if(i==1){
        LNode *s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        s->next=*L;
        // 需要更改头指针,使得L(头指针)直接就是s
        *L=s;
        return true;
    }
    LNode *p;
    int j=1;//没有头结点,也就是0节点,所以当前p是从第一个节点开始的
    p=*L;
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}
void test2(){
    LinkList L;
    InitList_withoutHead(&L);
    Listinsert_withoutHead(&L,1,1);
    Listinsert_withoutHead(&L,1,2);
    Listinsert_withoutHead(&L,1,3);
    Listinsert_withoutHead(&L,1,4);
    LNode *p=L;
    while(p!=NULL){
        printf("%d\n",p->data);
        p=p->next;
    }
}

因为不带头结点的单链表插入删除非常麻烦,所以后续的代码没有特别说明都是带头结点的。

  • 指定节点后插操作

时间复杂度为O(1)

// Insert element after designated node
bool InsertNextNode(LNode *p,int e){
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    // 内存分配失败
    if(s==NULL)
        return false;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

// test
void test1(){
   LinkList L;
    // L做头结点
    InitList_withHead(&L);
    Listinsert_withHead(&L,1,11);
    Listinsert_withHead(&L,2,22);
    Listinsert_withHead(&L,3,33);
    // 不可以出现两个p->next->next,不然要p=p->next干啥
    LNode *p=L->next;
    p=p->next;
    InsertNextNode(p,123);

    while(p!=NULL){
        printf("%d\n",p->data);
        p=p->next;
    }
}

对于元素的指定位置i的插入操作,只要找到第i-1个节点,就可以使用后插操作实现对指定位置i的插入操作。那么指定位置插入的代码会变为以下。

bool Listinsert_withHead(LinkList *L,int i,int e){
    // i means 位序
    if(i<1)
        return false;
    LNode *p;//指针p指向当前扫描到的节点
    int j=0;// 当前p指向的是第几个节点,这里指向的是头结点,认为是0节点
    p=(*L);
    // p->data=1111;
    // printf("%d\n",p->data);
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    return InsertNextNode((LNode *)p,e);
    // i is not legal
    // if(p==NULL)
    //     return false;
    // LNode *s=(LNode *)malloc(sizeof(LNode));
    // s->data=e;
    // s->next=p->next;// 这两句次序不可以改变
    // p->next=s;
    // return true;
}
  • 指定结点前插

节点不能跑路,但是结点的数据可以变化,当需要指定位置前插的时候,可以考虑申请一个后继节点s放在p节点后,修改s的数据为要p的数据2,修改p的数据为要插入的数据,这样实现的时间复杂度为O(1)

bool InsertPriorNode(LNode *p,int e){
    // 时间复杂度为O(1)
    if(p==NULL)
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    // 内存分配失败
    if(s==NULL)
        return false;

    s->data=p->data;
    s->next=p->next;
    p->next=s;
    p->data=e;
    return true;

}

// test
void test1(){
   LinkList L;
    // L做头结点
    InitList_withHead(&L);
    Listinsert_withHead(&L,1,11);
    Listinsert_withHead(&L,2,22);
    Listinsert_withHead(&L,3,33);
    LNode *p=L->next;
    p=p->next;
    InsertPriorNode(p,123);

    while(p!=NULL){
        printf("%d\n",p->data);
        p=p->next;
    }
}
  • 头插法建立单链表——链表的逆置

头插法建立单链表的时候,读入的数据与生成的链表的元素的顺序是相反的,当数据规模是n的时候,时间复杂度为O(n)

// 头插法建立单链表
void List_HeadInsert(LinkList *L){
    LNode *s;
    int e;
    scanf("%d",&e);
    while(e!=999){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        s->next=(*L)->next;
        (*L)->next=s;
        scanf("%d",&e);
    }
    // return L;
}
void test2(){
    LinkList L;
    InitList_withHead(&L);
    List_HeadInsert(&L);

    LNode *p=L->next;
    while(p!=NULL){
        printf("%d->",p->data);
        p=p->next;
    }
}
  • 尾插法建立单链表

时间复杂度和头插法一样,它生成链表的顺序和我们输入数据的顺序是一样的,尾插法需要动态维护一个尾指针,值得注意的是,如果没有把尾指针指向NULL,程序可能会出现不可预知的后果

// 尾插法建立单链表
void List_TailInsert(LinkList *L){
    int e;
    LNode *s,*r=*L;
    scanf("%d",&e);
    while(e!=999){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        r->next=s;
        r=s;
        scanf("%d",&e);
    }
    // 如果这里不添加NULL,则r的后面就会随意指向一个地址,将出现大问题
    r->next=NULL;
}
// print LinkList
void printfLinkList(LinkList L){
    LNode *p=L->next;
    while(p!=NULL){
        printf("%d->",p->data);
        p=p->next;
    }
}
void test2(){
    LinkList L;
    InitList_withHead(&L);
    List_TailInsert(&L);

    printfLinkList(L);
}
  • 按照位序删除结点

首先先检验位置的合法性,查找节点的第i-1个结点,最后进行删除操作。由于查找的事件复杂度为O(n),所以整体上时间复杂度为O(n)

if(p->next==NULL)//i-1后面没结点,不需要删除
        return false;
// 按位序删除-带头结点
bool ListDelete(LinkList *L,int i,int *e){
    if(i<1)
        return false;
    LNode *p=*L;// p指向当前扫描到的结点
    int j=0;//指向p的第几个节点
    
    while(p!=NULL&&j<i-1){//循环找到第i个结点
        p=p->next;
        j++;
    }
    if(p==NULL)//i的值不合法
        return false;
    if(p->next==NULL)//i-1后面没结点,不需要删除
        return false;

    LNode *q=p->next;
    p->next=q->next;
    *e=q->data;
    free(q);
    return true;

}
  • 指定结点的删除

如果给定一个头结点,可以找到指定节点的前驱节点,但是这样的事件复杂度为O(n),可以换一种思路,首先删除给定结点的后继节点,然后把后继节点的数据修改到当前指定节点的数据,这样的时间复杂度为O(1)

//有bug的代码,当删除的是最后一个节点的时候,执行到p->data=q->data;的时候会发生空指针错误
bool ListDelete_piont(LNode *p){
    if(p==NULL)
        return false;
    LNode *q=p->next;
    p->data=q->data;
    p->next=q->next;
    free(q);
    return true;

}

但是如果删除的结点p是最后一个结点,不能直接free§,这样前驱节点指向的下一个节点会随机,会造成不可预知的后果。如果是这种情况下的删除,并且当前给出了链表的头指针,可以考虑先找到单链表的前驱节点,再删除结点。

  • 按位查找

事件复杂度为O(n),这里我们认为,头结点为0号节点

LNode *GetElem(LinkList L,int i){
    if(i<0)
        return NULL;
    LNode *p=L;
    int j=0;
    while(p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;
}
  • 按值查找

时间复杂度为O(n)

LNode *GetElem_element(LinkList L,int e){
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e)
        p=p->next;
    return p;
}

双链表

  • 初始化双链表
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

typedef struct DNode{
    int data;
    struct DNode *prior,*next;
}DNode,*DLinklist;

// init Double Linklist
bool InitDLinklist(DLinklist *L){
    // 分配一个头结点
    *L=(DNode *)malloc(sizeof(DNode));
    if(*L==NULL)//内存分配失败
        return false;

    (*L)->prior=NULL;
    (*L)->next=NULL;
    return true;
}
// judge double linklist is empty or not
bool Empty(DLinklist L){
    if(L->next==NULL)
        return true;
    return false;
}
  • 在p结点后面插入一个双链表——后插操作
// insert a new node after designed node-p
//如果p结点是最后一个结点,那么在执行p->next->prior=s;会爆空指针错误
bool InsertNextDNode(DNode *p,DNode *s){
    s->next=p->next;
    p->next->prior=s;
    s->prior=p;
    p->next=s;
}

更具有健壮性的代码

// insert a new node after designed node_p
bool InsertNextDNode(DNode *p,DNode *s){
    if(p==NULL||s==NULL)//非法参数
        return false;
    s->next=p->next;
    if(p->next!=NULL)//没有后继结点的情况
        (p->next)->prior=s;
    s->prior=p;
    p->next=s;
    return true;
}
void printfDLinklist(DLinklist L){
    DNode *p=L->next;
    while(p!=NULL){
        printf("%d->",p->data);
        p=p->next;
    }
}
void test1(){
    DLinklist L;
    InitDLinklist(&L);
    DNode *s=(DNode *)malloc(sizeof(DNode));
    DNode *p=(DNode *)malloc(sizeof(DNode));
    p=L;
    s->data=64;
    InsertNextDNode(p,s);
    printfDLinklist(L);
}
void main(){
    test1();
}
  • 删除结点
// delete node
bool DeleteNextLinklist(DNode *p,int *e){
    if(p==NULL||p->next==NULL)
        return false;
    DNode *q=p->next;
    *e=q->data;
    if(q->next!=NULL)
        q->next->prior=p;
    p->next=q->next;
    free(q);
    return true;
}
void test1(){
    DLinklist L;
    InitDLinklist(&L);
    DNode *s=(DNode *)malloc(sizeof(DNode));
    DNode *q=(DNode *)malloc(sizeof(DNode));
    DNode *p=(DNode *)malloc(sizeof(DNode));
    p=L;
    s->data=64;
    s->next=NULL;
    InsertNextDNode(p,s);
    q->data=63;
    q->next=NULL;
    InsertNextDNode(p,q);
    printfDLinklist(L);
    int e=0;
    DeleteNextLinklist(p,&e);
    printf("\n");
    printfDLinklist(L);
}
  • 销毁双链表
void DestoryList(DLinklist *L){
    int e=0;
    // 循环删除L的后继结点
    while((*L)->next!=NULL){
        DeleteNextLinklist(*L,&e);
    }
    free(*L);
    *L=NULL;
}

循环链表

在定义循环链表的时候,如果使用的是头指针,在查询最后一个节点的时候时间复杂度为O(n),但是如果指针L指向表尾元素,那么从尾部找到头部和直接找尾部的时间复杂度都是O(1),这对于经常要使用头尾结点的场景很友好。

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

// init
bool InitList(LinkList *L){
    *L=(LNode *)malloc(sizeof(LNode));
    if(*L==NULL)
        return false;

    (*L)->next=*L;
    return true;
}
// judge
bool Empty(LinkList L){
    if(L->next==L)
        return true;
    return false;
}

// judge whether the p node is a tail pointer
bool isTail(LinkList L,LNode *p){
    if(p->next==L)
        return true;
    return false;
}
void test1(){
    LinkList L;
    InitList(&L);
    if(Empty(L))
        printf("yes!");

    if(isTail(L,L))
        printf("is tail!");
}
void main(){
    test1();
}

循环双链表

  • init
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct CDNode{
    int data;
    struct CDNode *prior,*next;
}CDNode,*CDLinklist;

// init 
bool InitCDLinklist(CDLinklist *L){
    *L=(CDNode *)malloc(sizeof(CDNode));
    if(*L==NULL)
        return false;

    (*L)->prior=*L;
    (*L)->next=*L;
    return true;
}
// judge whether the cdlinklist is empty
bool Empty(CDLinklist L){
    if(L->next==L)
        return true;
    return false;
}
// judge whether the p node is tail pointer
bool isTail(CDLinklist L,CDNode *p){
    if(p->next==L)
        return true;
    return false;
}
void test1(){
    CDLinklist L;
    InitCDLinklist(&L);
    if(isTail(L,L))
        printf("init completely!");

}
void main(){
    test1();
}
  • insert

特别要注意的是,这里的输出的判断是p的下一个节点是否是L,因为这个是循环双链表

// insert a new node s after p node
bool InsertNextCDNode(CDNode *p,CDNode *s){
    s->next=p->next;
    p->next->prior=s;
    s->prior=p;
    p->next=s;
}
void printfCDLinklist(CDLinklist L){
    CDNode *p=L->next;
    while(p!=L){
        printf("%d->",p->data);
        p=p->next;
    }
}
void test1(){
    CDLinklist L;
    InitCDLinklist(&L);
    CDNode *s=(CDNode *)malloc(sizeof(CDNode));
    s->data=111;
    s->next=NULL;
    s->prior=NULL;
    CDNode *x=(CDNode *)malloc(sizeof(CDNode));
    x->data=222;
    x->next=NULL;
    x->prior=NULL;
    InsertNextCDNode(L,s);
    InsertNextCDNode(s,x);
    printfCDLinklist(L);
}
void main(){
    test1();
}

静态链表

静态链表首先要分配一整片连续的内存空间,各个结点集中安置。静态链表和单链表类似,包含数据元素和指针元素(游标),但是这里的指针元素指向的是下一个节点的地址(数组下标)。并且0结点充当“头结点”。静态链表对于一些不支持指针的高级语言来讲设计是很巧妙的。

  • 定义一个结构体
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>

#define MAXSIZE 10//这里是不允许有分号结束符的
typedef struct{
    int data;
    int next;//下一个元素的数组下标
}SLinklist;


void test(){
    SLinklist s[MAXSIZE];
    printf("%d\n",sizeof(s));
}
void main(){
    test();
}
  • init
// init
bool initSLinklist(SLinklist s[MAXSIZE]){
    // 值得注意的是,在c的标准中是没有定义数组的长度进行定义的,但是在定义一个数组的时候,要求数组中括号中的数必须是常量和或者常量表达式,所以这个常量是可以作为长度传入的,但是这一操作却是在java中被允许的
    if(MAXSIZE==0)
        return false;
    s[0].next=-1;
    return true;
}
void test(){
    SLinklist s[MAXSIZE];
    if(initSLinklist(s))
        printf("yes!\n");
    printf("%d\n",sizeof(s));
}
void main(){
    test();
}
数据结构实验指导(初学内容) 实验一  线性表的顺序表示与实现 1.实验目的 (1)   掌握线性表的顺序存储结构; (2)   验证顺序表及其基本操作的实现; (3)   掌握数据结构及算法的程序实现的基本方法。 2.实验内容 (1)    建立含有若干个元素的顺序表; (2)    对已经建立的顺序表实现插入、删除、查找、合并等基本操作。 3.实现算法 首先,定义顺序存储结构如下: Typedef  s 阅读详情

相关推荐

【2023王道数据结构】【线性表—page40—19】C、C++完整实现(可直接运行)

~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ 如果需要完整代码可以关注下方公众号,后台回复“代码”即可获取,阿光期待着您的光临~ 题目: 设有一个带头结点的循环单链表,其结点值均为正整数,设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。 解题思路: >定义几个工作指针 >每次遍历找到最小值将其删除 >直到表为空 代码实现: #include <iostream> using namespac.

优快云 精品推荐 847

数据结构之线性表(代码,完整版)

线性表顺序表(动态存储)链表(不带头结点)链表(带头结点)双链表静态链表 顺序表(动态存储) #include<stdlib.h> #include<stdio.h> #include<iostream> using namespace std; #define InitSize 10 //定义最大长度 //静态分配 //typedef struct { // int data[InitList]; // int length; //}SqlList;

起个名字真难的博客 4882

(十)第 2 章 线性表 ( 双链循环线性表(链式存储))

算法 2.18、2.19

墨夜白 296

数据结构——线性表代码总结

1.线性表结构定义 typedef struct { int a[100];//或定义MaxSize int length; }SqList; 其中length记录线性表长度,a是数据域。 2.根据位置i获取相应位置数据元素的内容

Acc222222的博客 3156

解决 TensorFlow 和 Keras 的 Python 版本兼容问题:详细技术指南

本文提供了TensorFlow和Keras与Python版本不兼容问题的完整解决方案。通过版本对照表指出不同TensorFlow版本对应的Python支持范围,强调2.13.x仅支持Python 3.9-3.11,且不兼容Python 3.12+。给出最佳实践建议:使用虚拟环境管理项目依赖,推荐venv或conda创建独立环境;指导正确安装TensorFlow和Keras版本,建议优先使用tf.keras避免冲突;针对常见报错如DLL加载失败、模块导入错误等提供具体解决方法。最后给出一个在兼容环境中运行的M

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1665

RK3568开发板Debian系统屏幕旋转终极指南:从临时调整到永久设置

本文提供了RK3568开发板在Debian系统下实现屏幕旋转的完整解决方案。从使用xrandr命令进行临时调整,到修改X11配置文件实现永久设置,详细讲解了操作步骤与核心原理。指南还涵盖了多屏异显配置、触摸屏坐标校准等进阶技巧,帮助开发者彻底解决显示方向问题。

weixin_29181861的博客 390

线性表初始化运行代码

#include <stdio.h> #include <stdlib.h> #define Max 100 //定义数组的最大长度 typedef int Datatype; //定义数组的数据类型 typedef struct{ Datatype data[Max]; //data数组用于开辟一段连续的存储空间 int length; //定...

努力变得不菜的菜鸡的博客 4096

给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录

本文详细介绍了在Jetson Orin Nano上为宇树Go2机器人部署YOLOv5视觉系统的完整流程,涵盖硬件选型、环境配置、模型优化及系统集成等关键步骤。针对机器人应用场景特有的离线部署、版本冲突和实时推理等挑战,提供了实用的解决方案和性能优化技巧,帮助开发者快速实现机器人的视觉能力升级。

weixin_29169505的博客 379

数据结构C语言版——初始化一个线性表

数据结构C语言版——初始化一个线性表

xiaochenxiaoren的博客 2万+

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 286

数据结构代码实现之线性表

算法思想:遍历寻找最小值并记住位置,结束之后删除替代操作即可。//定义单链表节点 ElemType data;//数据域 struct LNode * next;//指针域 } LNode , * LinkList;

礼乐的博客 1883

水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型

自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。

kkchenjj的博客 933

数据结构 线性表部分代码 C语言转写(待补充)

待补充完整

qwertyuiop2216210的专栏 748

【YOLOv8/v9/v10 实战 01】YOLOv8/v9/v10全系列实战对决:性能矩阵、架构拆解与2026部署指南

2026年YOLO生态已进入“战国时代”,Ultralytics YOLOv8/11/26、阿里YOLO12、清华YOLOv10、微软YOLOv9四大路线并行发展。本文基于官方文档、学术论文及实测数据,系统剖析三大核心版本(YOLOv8/v9/v10)的架构演进逻辑,构建覆盖参数量、mAP、FPS、FLOPs的完整性能矩阵。通过8组工业场景实测、全流程代码实现(训练-导出-部署)、6类硬件适配方案,解决新手选型难、进阶者优化无门、工业开发者部署低效的痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 537

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1137

王道数据结构代码题(C语言) 线性表部分

1.顺序表删除最小元素,并函数返回,删除位置由最后一个元素填补。

Cerulea_n的博客 483

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

关于数据结构(c语言)中,线性表中顺序存储结构的大部分操作的代码实现

本篇文章将要介绍的,是线性表(逻辑结构)中的顺序结构(存储结构),是限线性表的基础之一,而在下列程序中,将要通过对顺序表进行初始化、判断空满、输出、追加、插入、删除、逆序、升序排序(冒泡排序)进行分析和书写。

weixin_60700743的博客 734

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

关于数据结构(c语言)中,线性表中链式结构的大部分操作的代码实现

本篇文章将要介绍的,是线性表(逻辑结构)中的链式结构(存储结构),是线性表的基础之一,而在下列程序中,将要通过对链表的创建、判空、遍历输出、长度输出、升序排序(冒泡排序)、插入、删除的分段过程,对整体代码进行分析与解剖。

weixin_60700743的博客 744

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C/C++版】王道数据结构代码题——线性表部分持续更新

一、顺序表 /* * 2.1 删除最小元素,并用最后一个元素填充 */ void delete_min(sqlList &L, ElemType &e) { //顺序表为空时,输出错误信息 if (L.length == 0) { cout << "error!" << endl; e = -1; return; } /* * min:最小值 * min_i:最

weixin_44802633的博客 396

线性表的类型定义

一、线性表的定义线性表是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限序列。数据元素可以是一个数、一个符号、也可以是一幅图、一页书或更复杂的信息。线性表例:1、1 2 3 4 5 6 7 2、       3、学号 姓名 语文 数学 C语言 6201001 张三 85 54 92 6201002 李四 92 84 64 6201003

yzkzoo 894

数据结构中的线性表与链表的个人理解

数据结构中的线性表与链表的个人理解 写在前面 本人是一名西南交通大学2020级自动化专业的学生,由于本人最近正在学习数据结构,遂想在此陈述一下对线性表与链表的个人理解。这篇博客主要参考了清华大学出版社的《数据结构C语言版》,其他的很多地方也补充了一些个人理解,读起来不那么官方和专业,如有不当之处希望各位大佬们多多指教. 线性表与链表的数据单元结构 线性表与链表的数据单元都具有头节点,我们可以通过这个头结点来找到下一个元素的位置,但是有一点不同:线性表顾名思义是一个线性存储结构,其地址是连续的,就和数

weixin_50997145的博客 324

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计&&数据结构程序设计分析

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计&&数据结构程序设计分析

weixin_62613321的博客 1422

数据结构C语言版部分代码

例如,表示某单链表L的头节点的指针域用“ L->next ”,但是顺序栈的栈顶指针用“ S.top ”指针变量操作某成员用“ -> ”而不是“ . ”链栈 LinkStack(StackNode)链队列 LinkQueue(QNode)单链表 LinkList(LNode)循环队列(顺序存储) SqQueue。顺序栈 SqStack。顺序表 SqList。

小白的编程学习之旅 248

数据结构day2-day3-线性表之顺序表的代码

数据结构day2-day3-线性表之顺序表的代码

AuroraSmith的博客 187

数据结构C语言版入门到进阶

该章节大家需要熟悉线性表的种类,然后掌握各种类型的代码实现方法

rr1170712484的博客 877
上一篇: HCIP-AI语音处理理论、应用
下一篇: 数据结构应用题第二章线性表代码
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值