数据结构(C语言版2023-1-10)

第一章:数据结构概述

1.概述



/*
 *
 * 数据结构与算法:
 *          数据(Data):描述客观事物的符号 是计算机中可以操作的对象
 *             是能被计算机识别 并输入给计算机处理的集合
 *        数据元素:组成数据的 有一定意义的基本单位 在计算机中通常作为整体处理 也被称为记录
 *        数据元素组成数据
 *        
 *        数据项:数据项是数据不可分割的最小单位
 *        一个数据元素可以由若干个数据项目组成
 *        
 *       数据对象:性质相同的数据元素的集合 是数据的子集
 *       
 *       
 *       数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合
 *       数据元素+特定关系=数据结构
 *       
 *       
 *       
 *
 * */


2.逻辑与物理结构

集合结构:
		集合结构中的数据元素同属于一个集合
		数据元素相互之间没有其他关系
		
线性结构:数据元素之间是一对一的关系


数形结构:数据之间一对多的关系

图形结构:数据元素之间多对多的关系


定义:又叫做存储结构 是指数据的逻辑结构在计算机中的存储形式

顺序存储结构:把数据元素存储在地址连续的存储单元里
数据间的逻辑关系与物理关系一致

链式存储结构:把数据元素放在任意的存储单元里



数据类型:计算机中 内存空间是有限的 不同类型的数据分配的内存空间大小不同

数据类型是指一组性质相同的值的集合及定义在此集合上的一些操作的总称
在C语言中 按照取值的不同 数据类型分为两类:
	原子型:不可以再分的基本类型 包括整型 实型 字符型等
	结构型:有若干个类型组合而成 是不可再分解的 例如:整型数组是由若干个整型数据组成的


抽象数据类型:是对已有的数据类型进行抽象
抽象数据类型是指一个数据模型及定义在该模型上的一组操作



第二章:线性表

1.线性表抽象数据类型

线性表:零个或多个数据元素的有限序列

它是一个序列:数据元素之间是有序的
数据元素之间是一对一的关系

有限性  
		线性表的元素个数是有限的
		
		注意:零个数据元素的有限序列又被称为空表
		
		
		
线性表又那些常见的操作:
		1.常见和初始化
		2.查找
		3.插队
		4.清空





ADT 线性表(SequenceList)
Data
		1.线性表的数据元素是一个集合(a1,a2,a3...an)
数据元素的类型DataType(int char  自定义)
2.前驱:除了第一个元素a1外 每个元素有且仅有一个直接的前驱元素
3.后继:除了最后一个元素an外 每个元素有且仅有一个直接的后继元素
4.每个数据元素之间的关系是一对一的关系




Operation:初始化(initList(*List))  初始化线性表 创建一个空的线性表List
  插入:(InsertElement(*list,index,elem))  在线性表list的index下标处传入元素elem
		删除:DeleteElement(*List,index,*elem)  删除线性表List中第i个元素 并返回删除元素的指针
查找:GetLength(*List)
		IsEmpty(*List)
  

endADT
cmake_minimum_required(VERSION 3.21)
project(untitled2 C)

set(CMAKE_C_STANDARD 99)

add_executable(untitled2 main.c)
线性表的顺序存储示意图:
线性表的顺序存储结构 指的是用一段地址连续的存储单元 依次存储线性表的数据元素

描述线性表的顺序存储结构需要三个属性:

1.我们要定义线性表的最大存储空间
	#define MAX SIze 255
2.线性表里面需要有统一类型的元素集合
	int num;
	typedef int ElemType
	typedef struct{
	
	int id,
	char *name
	}ElementType
3.定义顺序表结构


typedef struct{
ElementType data[MAX_SIZE];
int length
};


三个属性:
---存储开年的起始位置 :数组datas的存储位置
---线性表的最大存储容量 :数组长度MAX_SIZE
---线性表的当前长度:length



地址计算方法:

		position   位置  从1开始
		index   下标 从0开始
		


推出:顺序表数据元素的下标=当前数据元素所在的序列位置-1




#include <stdio.h>
#include "DataElement.h"
#include "SequenceList.h"


ElementType dataArray[]={
        {1,"第一个"},
        {2,"第二个"},
        {3,"第三个"},
        {4,"第四个"},
};

void TestSequenceList();

int main() {


    TestSequenceList();


    return 0;
}

void TestSequenceList(){
    SeqList seqList;
    InitList(&seqList,dataArray,4);
    PrintList(&seqList);

}

//
// Created by ~风轻云淡~ on 2023/1/10.
//

#ifndef PRO01_DATAELEMENT_H
#define PRO01_DATAELEMENT_H

#define MAX_SIZE 255


//1.定义数据元素
//定义数据元素的方法:  例如:data={{1,""},{2,""},{3,""}}
//typedef int ElementType;
typedef struct {
    int id;
    char * name;

}ElementType;

//2.定义顺序表结构
typedef struct {

    ElementType datas[MAX_SIZE];//顺序表中的元素集合
    int length;//当前顺序表中的元素个数
}SeqList;




#endif //PRO01_DATAELEMENT_H




//
// Created by ~风轻云淡~ on 2023/1/10.   定义顺序表
//

#ifndef PRO01_SEQUENCELIST_H
#define PRO01_SEQUENCELIST_H

#include "stdio.h"
#include "stdlib.h"


//导入顺序表
#include "DataElement.h"


//1.初始化链表  seqList要初始化的顺序表
//2.elementArray 初始化时 要天津爱的元素内容数组
//3.length  初始化时 天津爱的元素个数
void InitList(SeqList *seqList,ElementType *elementArray,int length);

//1.向顺序表中的index下标出插入某个元素
//seqList
//index  要插入的下标
//element 要插入的元素
void InsertElement(SeqList *squList,int index,ElementType elementType);


void PrintList(SeqList*seqList);



#endif //PRO01_SEQUENCELIST_H

//
// Created by ~风轻云淡~ on 2023/1/10.
//

#include "SequenceList.h"

//1.初始化链表  seqList要初始化的顺序表
//2.elementArray 初始化时 要天津爱的元素内容数组
//3.length  初始化时 天津爱的元素个数
void InitList(SeqList *seqList,ElementType *elementArray,int length){

//    下标为i及下标为i以后的所有数据元素后移
//下标i的位置

if(length>MAX_SIZE){

    printf("超出了数组的最大边界");
    return;

}

    for (int i=0;i<length-1;i++){
//        每个循环都插在下标为i的位置入一个元素
        InsertElement(seqList,i,elementArray[i]);
    }



}

//1.向顺序表中的index下标出插入某个元素
//seqList
//index  要插入的下标
//element 要插入的元素
void InsertElement(SeqList *squList,int index,ElementType elementType){
    //1.验证插入后的元素空间是否超过最大空间
//2.index的值是否合法 [0,MAX_SIZE-1]
//3.插入的index应该在length之内
//4.从第length-1个下标开始 前面一个元素赋值给后面一个元素 将插入的元素赋值给下标为index元素



if(squList->length+1>=MAX_SIZE)
{
    printf("数组已经满 插入元素越界\n");
    return;

}
if(index<0||index>MAX_SIZE-1){

    printf("只能在允许的范围内插入元素[0,%d]",MAX_SIZE);
    return;
}
    if (index>squList->length){
        printf("插入的下标超过了数组的最大长度 -1 插入失败\n");
        return;
    }
//开始插入算法
    for (int i = squList->length-1; i >=index ; i--) {
        squList->datas[i+1]=squList->datas[i];
    }
//5.将要插入的值赋值给index个元素
squList->datas[index]=elementType;
//    顺序表的总长度加以
squList->length++;

}

void PrintList(SeqList*seqList){

    for (int i = 0; i <seqList->length ; ++i) {
        printf("%d\t%s\n",seqList->datas[i].id,seqList->datas[i].name);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值