C数据结构:线性表

推荐书籍:《算法导论》 《编程之美》

什么是数据结构?

1.数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。(数据不仅包含整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。)

2.数据元素

数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被成为记录。(比如:鸡鸭牛羊猪狗等动物就是禽类的数据元素)

3.数据项

数据项:一个数据元素可以由若干个数据项组成。(比如:人可以有眼耳口鼻这些数据项)。
数据项是数据不可分割的最小单位。

4.数据对象


数据对象:是性质相同的数据元素的集合,是数据的子集。(什么是性质相同呢,是指数据元素具有相同数量和类型的数据项,比如:人都有姓名、生日、性别等相同的数据项)
既然数据对象是数据的子集,在实际应用中,处理的数据元素通常具有相同性质,在不产生混淆的情况下,我们都将数据对象简称为数据。

5.数据结构

不同的数据元素之间不是独立的,而是存在特定的关系,我们将这些关系成为结构。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

开课了!!

数据逻辑结构大概分为两大类:线性结构和非线性结构。

线性结构:线性表,栈,队列。(一对一)

非线性结构:树,图,集合。(一对多,多对多,独立)

存储形式:顺序存储,链式存储

顺序存储:arr数组

链式存储:单链表,双向链表

面试常考:单项循环链表,单项不循环链表,有头节点单链表,无头节点单链表。

现实常用:双向链表。

 线性表实现

存储结构

#ifndef _SQLIST_H
#define _SQLIST_H

#define DATASIZE 1024
typedef int datatype;

typedef struct node_st
{
    datatype data[DATASIZE];
    int last;

}sqlist;

#endif

创建


sqlist* sqlist_create()
{
    sqlist*me;
    me = malloc(sizeof(*me) );
    if(me == NULL)
        return NULL;
    me->last = -1; 
    return me; 

}
void sqlist_create1(sqlist** ptr)
{
    *ptr = malloc(sizeof(**ptr));
    if(*ptr ==NULL)
        return;
    (*ptr)->last = -1; 
    return;
}

int main()
{
    sqlist* list;
    printf("sizeof = %ld \n",sizeof(*list) );
    list = sqlist_create();
        
    sqlist_create1(&list);
    if(list == NULL)
    {   
        printf("err \n");
    }   

    sqlist_destory(list);
   
   exit(0);
}

插入

int sqlist_insert(sqlist* me,int i,datatype *data)
{   
    if(me->last == DATASIZE-1 )  //存满失败
        return -1;
    if(i<0 || i >me->last +1 )
        return -2;
    int j = me->last; //j是最后一个数据有效位置的值
    for(;i<=j;j--)
        me->data[j+1] = me->data[j];
    
    me->data[i] = *data;
    me->last++;
    
    return 0;
}

显示

void sqlist_display(sqlist*me)
{
    if(me->last == -1)
        return;
    for(int i=0;i<= me->last;i++)
    {
        printf("%d ",me->data[i]);
    }
    printf("\n");
    return ;

}

测试输出

int main()
{   
    sqlist* list;
    printf("sizeof = %ld \n",sizeof(*list) );
    list = sqlist_create();
    
    sqlist_create1(&list);
    if(list == NULL)
    {   
        printf("err \n");
    }
    int err; 
    datatype arr [] = {12,22,33,44,55};
    for(int i=0;i< sizeof(arr)/sizeof(*arr);i++)
    {   
        if( (err = sqlist_insert(list,0,&arr[i])) != 0 )
        {
        printf("insert error \n");
        if(err == -1)
            fprintf(stderr,"the arr is full \n");
        else if(err == -2)
            fprintf(stderr,"the pos is not continuous\n");
        else
            fprintf(stderr,"Error\n");
        exit(-1);
        }
    }
     sqlist_insert(list,2 ,&arr[0]);
    sqlist_display(list);
    sqlist_destory(list);
   
}

删除元素

 int sqlist_delete(sqlist* me,int i)
 {
      int j;
      if(i<0 || i > me->last )
          return -1;
      for(j = i+1; j< me->last;j++)
      {
          me->data[j-1] =me->data[j]
      }
      me->last--;
      
      return 0;
  }

完整实现

main.c

#include <stdlib.h>
#include <stdio.h>
#include "sqlist.h"

int main()
{
    sqlist* list,*list1;
    printf("sizeof = %ld \n",sizeof(*list) );
    list = sqlist_create();
    
    sqlist_create1(&list);
    sqlist_create1(&list1);
    if(list == NULL)
    {
        printf("err \n");
    }
    int err;
    datatype arr [] = {12,22,33,44,55};
    for(int i=0;i< sizeof(arr)/sizeof(*arr);i++)
    {
        if( (err = sqlist_insert(list,0,&arr[i])) != 0 )
        {
        printf("insert error \n");
        if(err == -1)
            fprintf(stderr,"the arr is full \n");
        else if(err == -2)
            fprintf(stderr,"the pos is not continuous\n");
        else
            fprintf(stderr,"Error\n");
        exit(-1);
        }    
    }
   // sqlist_setempty(list);
     sqlist_insert(list,0 ,&arr[0]);
     sqlist_insert(list1,0 ,&arr[0]);
    printf("list: \n");
    sqlist_display(list);
    printf("list1: \n");
    sqlist_display(list1);
    sqlist_union(list,list1);
   //  sqlist_delete(list,0);
    sqlist_display(list);
    sqlist_destroy(list);
    sqlist_destroy(list1);
   
   exit(0);
}




sqlist.c

#include  "sqlist.h"
#include <stdlib.h>
#include <stdio.h>


sqlist* sqlist_create()
{
    sqlist*me;
    me = malloc(sizeof(*me) );
    if(me == NULL)
        return NULL;
    me->last = -1;
    return me;

}
void sqlist_create1(sqlist** ptr)
{
    *ptr = malloc(sizeof(**ptr));
    if(*ptr ==NULL)
        return;
    (*ptr)->last = -1;
    return;
}



int sqlist_insert(sqlist* me,int i,datatype *data)
{
    if(me->last == DATASIZE-1 )  //存满失败
        return -1;
    if(i<0 || i >me->last +1 )
        return -2;
    int j = me->last; //j是最后一个数据有效位置的值
    for(;i<=j;j--)
        me->data[j+1] = me->data[j];
    
    me->data[i] = *data;
    me->last++;

    return 0;
}

int sqlist_delete(sqlist* me,int i)
{
	int j;
	if(i<0 || i > me->last )
		return -1;
	for(j = i+1; j< me->last;j++)
	{
		me->data[j-1] =me->data[j];
	}
	me->last--;

	return 0;
}

int sqlist_find(sqlist* me,datatype*data)
{
	if(sqlist_isempty(me) == 0 )
		return -1;
	for(int i=0;i<= me->last ;i++)
	{
		if(me->data[i] == *data)
			return i;
	}
	return -2;

}

int sqlist_isempty(sqlist*me)
{
	if(me->last == -1)
		return 0;
	return -1;
}

int sqlist_setempty(sqlist*me)
{
	me->last = -1;
	return 0;
}

int sqlist_getnum(sqlist*me)
{
	return me->last+1 ;
}

void sqlist_display(sqlist*me)
{
    if(me->last == -1)
        return;
    for(int i=0;i<= me->last;i++)
    {
        printf("%d ",me->data[i]);
    }
    printf("\n");
    return ;

}

int sqlist_destroy(sqlist*me)
{
	free(me);
	return 0;
}

int sqlist_union(sqlist*list1,sqlist* list2)
{
	for(int i=0;i<list2->last;i++)
	{
		if(sqlist_find(list1,&list2->data[i]) < 0 )
		{
			sqlist_insert(list1,list1->last,&list2->data[i]);
		}
	}
	return 1;
}



sqlist.h

#ifndef _SQLIST_H
#define _SQLIST_H

#define DATASIZE 1024
typedef int datatype;

typedef struct node_st
{
    datatype data[DATASIZE];
    int last;

}sqlist;

sqlist* sqlist_create();
void sqlist_create1(sqlist**);

int sqlist_insert(sqlist*,int i,datatype *);

int sqlist_delete(sqlist*,int i);

int sqlist_find(sqlist*,datatype*);

int sqlist_isempty(sqlist*);

int sqlist_setempty(sqlist*);

int sqlist_getnum(sqlist*);

void sqlist_display(sqlist*);

int sqlist_destroy(sqlist*);

int sqlist_union(sqlist*,sqlist*);

#endif

makefile

CC = gcc
OBJS = main.o sqlist.o
CFLAGS= -g -c -Wall

all:$(OBJS)
	$(CC)  $^ -o $@

%.o:%.c
	$(CC) $^ $(CFLAGS) -o $@

clean:
	$(RM) -r *.o all

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/589181.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载安装 VisualVM

1、下载安装 VisualVM 第1步&#xff1a;下载地址&#xff1a;https://visualvm.github.io/ 第2步&#xff1a;解压到制定位置 第3步&#xff1a;指定jdk路径 下载完成后&#xff0c;在etc文件夹下找到visualvm.conf文件&#xff0c;设置jdk路径visualvm_jdkhome"D:\ITS…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

ElasticSearch教程入门到精通——第一部分(基于ELK技术栈elasticsearch 8.x新特性)

ElasticSearch教程入门到精通——第一部分&#xff08;基于ELK技术栈elasticsearch 8.x新特性&#xff09; 1. ElasticSearch安装&#xff08;略&#xff09;2. ElasticSearch基础功能2.1 索引操作2.1.1 创建索引2.1.2 Head 索引2.1.3 查询索引2.1.3.1 查询单独索引2.1.3.2 查询…

【MATLAB】GUI初步设计

MATLAB界面设计 前言一、基本步骤1.1 创建GUI文件1.2 界面设计 总结 前言 为了完成图像处理的作业&#xff0c;简直就是生活不易啊 找到一个很棒的教学视频 基于MATLAB的GUI界面设计流程讲解 一、基本步骤 1.1 创建GUI文件 由于在写博文之前我已经创建好文件了&#xff0c;…

邊緣智能2024—AI開發者峰會(5月9日)數碼港即將啟幕

隨著 AI &#xff08;人工智能&#xff09;技術的飛速發展&#xff0c;我們正迎來邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同演繹分布式智能創新應用的壯麗篇章。"邊緣智能2024 - AI開發者峰會"將聚焦於這一前沿領域&#xff0c;探討如何通過邊緣計算…

中国发布首个汽车大模型标准

&#x1f989; AI新闻 &#x1f680; 中国发布首个汽车大模型标准 摘要&#xff1a;中国信息通信研究院于4月28日发布了国内首个汽车大模型标准&#xff0c;标志着汽车行业正式迈向“人工智能&#xff0b;”时代。该标准包含三个核心能力域&#xff1a;场景丰富度、能力支持度…

Pytorch学习笔记——环境配置安装

1、下载和配置环境 Anacodna必备&#xff08;工具包里面都包含的有&#xff0c;集成与运用科学分析的软件&#xff0c;比较方便&#xff09; 点击这个网页:Download Now | Anacondahttps://www.anaconda.com/download/success 按照教程安装&#xff08;教程可以自己在网上搜…

XY_RE复现(五)

一&#xff0c;给阿姨倒一杯卡布奇诺 是一道魔改TEA加密 给出了一些初始化&#xff0c;然后输入的flag拆分&#xff0c;两两一组&#xff0c;通过for循环放入encrypt加密函数 #include <stdio.h> #define uint32_t unsigned intvoid decrypt(uint32_t *v, uint32_t *ke…

拆单算法交易(Algorithmic Trading)

TWAP TWAP交易时间加权平均价格Time Weighted Average Price 模型&#xff0c;是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时间进行均匀分割&#xff0c;并在每个分割节点上将拆分的订单进行提交。例如&#xff0c;可以将某个交易日的交易时间平均分为N 段&am…

守护数据安全: 零信任视角下的勒索病毒防范之道

前言 就在近日&#xff0c;鸿海集团旗下半导体设备大厂——京鼎精密科技股份有限公司&#xff08;以下简称“京鼎”&#xff09;遭到了黑客的入侵。黑客在京鼎官网公布信息直接威胁京鼎客户与员工&#xff0c;如果京鼎不支付赎金&#xff0c;客户资料将会被公开&#xff0c;员…

pyqt 滑动条控件QSlider

pyqt 滑动条控件QSlider 滑动条控件QSlider效果代码 滑动条控件QSlider QSlider 是 PyQt中的一个控件&#xff0c;它允许用户通过拖动滑块或点击滑块轨道上的任意位置来选择一系列值。 QSlider 有两种主要的类型&#xff1a;Qt.Horizontal&#xff08;水平滑块&#xff09;和 …

java版数据结构:深入理解栈和队列:数据结构与应用(vector,stack,queue)

目录 前言 动态数组类&#xff08;vector&#xff09; 特点&#xff1a; 应用&#xff1a; 栈&#xff08;Stack&#xff09; 栈的基础概念&#xff1a; 栈的常用方法&#xff1a; 模拟栈操作&#xff1a; 队列&#xff08;Queue&#xff09; 队列的基础概念 队列的常…

VS Code工具将json数据格式化

诉求&#xff1a;json数据格式化应该在工作中用到的地方特别多&#xff0c;为了更方便、更仔细的对json数据查看&#xff0c;将json数据格式化是非常有必要的。 VS Code中如何将json数据快速格式化 1、在VS Code中安装Beautify JSON插件 2、安装完后在需要格式化的文件中按住…

Easy TCP Analysis上线案例库功能,为用户提供一个TCP抓包分析案例分享学习的平台

​案例库&#xff0c;提供给用户相互分享TCP抓包故障排查案例或是经典学习案例的功能&#xff0c;任何用户都可从案例库查看其它用户分享的案例&#xff0c;每个用户也都可以上传自己的案例&#xff0c;经过平台审核去重即可展示在案例库。 对于学习&#xff0c;最典型的三次握…

Linux进程概念(下)

Linux进程概念 1. 命令行参数2. 环境变量2.1 环境变量的概念2.2 环境变量的使用和一些问题2.3 获取环境变量2.4 深入理解环境变量2.5 环境变量相关的命令 3. 进程地址空间3.1 基本概念3.2 为什么要有地址空间 1. 命令行参数 main函数也可以带参数的&#xff0c;如下 #include…

Linux内核之原子操作:atomic_long_dec用法实例(六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2023-2024年汽车行业报告/方案合集(精选345份)

汽车行业报告/方案&#xff08;精选345份&#xff09; 2023-2024年 来源&#xff1a;2023-2024年汽车行业报告/方案合集&#xff08;精选345份&#xff09; 【以下是资料目录】 2023中国汽车科技50强 2023中国智能汽车产业发展与展望 2023比亚迪海豹汽车拆解报告 2023新能…

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波

什么是高斯滤波 高斯滤波是一种常见的图像处理技术&#xff0c;用于去除图像中的噪声和平滑图像。它的原理基于统计学中的高斯分布&#xff08;也称为正态分布&#xff09;。 在高斯滤波中&#xff0c;一个二维的高斯核函数被用来对图像中的每个像素进行加权平均。这个高斯核…

【沉淀之华】从0到1实现用户推荐 - 实时特征系统构建,包含特征计算,特征存储,特征查询,特征补偿超详细思路分享

文章目录 背景介绍设计初衷基本概念 技术架构"四高"特征存储特征计算特征查询特征补偿 技术难点Q&A彩蛋 背景介绍 设计初衷 作为用户推荐系统的支撑系统之一&#xff1a;用户实时特征系统有着举足轻重的重要&#xff0c;甚至说它是一起推荐行为触发的必要条件。…

【经典算法】LeetCode 160. 相交链表(Java/C/Python3/Go实现含注释说明,Easy)

目录 题目描述思路及实现方式一&#xff1a;哈希表思路代码实现Java版本C语言版本Python3版本Golang版本 复杂度分析 方式二&#xff1a;双指针思路代码实现Java版本C语言版本Python3版本Golang版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;链表 题目描述 给你两…