数据结构1

数据结构的概念

数据介绍

数据:计算机能够识别,存储,用来描述客观事物的。

数据的种类:

数值数据:整数,小数,字符串......

非数值数据:图像,视频,音频......

数据的组成:数据项--->数据元素--->数据对象--->数据

数据项:数据的最小单位,用来组成数据元素。(例:一个学生的学号)

数据元素:由数据项组成,用来描述事物特征的。(例:一个学生)

数据对象:由属性相同的数据元素组成的数据对象。(例:一个班级)

数据结构研究的是数据元素

结构介绍

结构:数据元素之间的关联情况

结构的种类:逻辑结构,存储结构

  1. 逻辑结构:就是数据元素之间的关系,具体可以分为以下几种结构

集合结构:数据元素之间没有任何关系。单纯在一个集合中而已。

线性结构:数据元素之间存在一对一的关系。这种结构,除了第一个元素没有前驱,最后一个元素没有后继以外,每个元素都有一个前驱和一个后继。

树形结构:数据元素之间存在一对多的关系。

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

  1. 存储结构:将逻辑结构上的数据元素在物理内存上的映射

顺序存储:将数据元素逻辑上相连,在物理内存上也相连。

链式存储:将逻辑上相连的数据,在物理内存上随机存储。

索引存储:将存储的数据用一个索引表记录存储的位置。

散列存储:又称为哈希存储,存放数据的位置与数据自己有关系。

线性表

概念:相同属性的数据元素组成的线性结构,称为线性表

特点:

  1. 数据元素属性相同
  2. 数据元素之间是线性结构

种类:顺序表(顺序存储的线性表),链表(链式存储的线性表),栈(操作受限的线性表),队列(操作受限的线性表)

顺序表(sequence)

顺序表:顺序存储的线性表

顺序表存放的方式

可以使用数组存放数据,可以实现逻辑上相连,物理内存上也相连。

也可以用malloc在堆区申请一片连续的空间,存放数据,实现逻辑相连,物理内存上也相连。

顺序表的组成

需要一片连续的空间,存放数据,可以是数组,也可以是连续的堆区空间。

还需要一个变量来记录当前顺序表的长度(以存放的元素个数)。

顺序表结构体

格式:

struct sequence

{

char data[20];

int len; //顺序表的长度,已存放的元素个数

};

例:

//宏定义  线性表的最大容量
#define MAX 30

//类型重定义,表示要存放数据的类型
typedef char DataType;

//定义顺序表的结构体类型
typedef struct sequence
{
    DataType data[MAX];
    int len; //顺序表的长度,已存放的元素个数
}seqList, *seqListPtr;

顺序表的相关操作(功能函数的封装)

顺序表的创建

函数功能:创建一个顺序表。

在堆区申请顺序表的大小空间,将申请的地址返回给主程序使用,需要判断申请的堆区空间是否合法。创建完顺序表后需要将顺序表长度置0,将数组清空。

格式:

数据类型 函数名 ()

{

数组;

顺序表长度;

}

分析:

数据类型:与顺序表的指针的类型相同

  1. 先在头文件中定义顺序表结构体(定义数组表示顺序表的最大容量,定义int类型变量表示顺序表长度),并声明顺序表的创建
  2. 在源文件中完成顺序表空间的申请和判断空间是否合法
  3. 在main文件中完成顺序表的创建

判空

功能:判断顺序表是否为空(顺序表长度为0)

需要判断申请的堆区空间是否合法

参数列表:顺序表

如果为空返回真(1),非空返回假(0)

判满

功能:判断顺序表是否为满(顺序表长度为最大值)

需要判断申请的堆区空间是否合法

参数列表:顺序表

如果为满返回真(1),非满返回假(0)

顺序表的增加

功能:增加顺序表(将新的数据放入下标为len的位置)

需要判断申请的堆区空间是否合法

参数列表:顺序表,要增加的数据

需要判断顺序表是否为满

顺序表的遍历

功能:遍历顺序表

需要判断申请的堆区空间是否合法

参数列表:顺序表

需要判断顺序表是否为空

任意位置插入数据

需要判断申请的堆区空间是否合法

参数列表:顺序表,插入位置,插入数据

练习: 

 

存放学生的信息。

i) 独立完成今天顺序表的创建、判空、判满、增加、遍历、任意位置插入数据。(要求:尽量每行代码都有注释)

ii) 完成顺序表的任意位置删除数据功能函数的封装。

头文件

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

//宏定义  线性表的最大容量
#define MAX 30
                                                        

//定义顺序表的结构体类型
typedef struct sequence
{
    //定义结构体
    struct student
    {
        char name[128];
        int age;
    }stu;
    int len; //顺序表的长度,已存放的元素个数
}seqList, *seqListPtr;

//顺序表的创建
seqListPtr seq_create();

//判空
int empty(seqListPtr s);

//判满
int full(seqListPtr s);

//顺序表增加
int seq_add(seqListPtr s,char a[128],int b);            


//顺序表遍历
void seq_show(seqListPtr s);

源文件

#include "sequence.h"

//顺序表的创建
seqListPtr seq_create()
{
    //在堆区申请顺序表的空间,返回给主函数使用
    seqListPtr s=(seqListPtr)malloc(sizeof(seqList));

    //判断空间是否合法
    if(NULL==s)
    {
        printf("创建失败\n");
        return NULL;
    }

    //顺序表的长度置0
    s->len=0;

    printf("创建成功\n");
    return s;

}

//判空
int empty(seqListPtr s)
{
    if (NULL==s)
    {
        printf("顺序表不合法\n");
        return -1;
    }
    else
        return s->len==0;
}

//判满
int full(seqListPtr s)
{
    if (NULL==s)
    {
        printf("顺序表不合法\n");
        return -1;                                             
    }
    else
        return s->len==MAX;
}
 //顺序表增加                                         
 int seq_add(seqListPtr s,char a[128],int b)
 {
     if (NULL==s || full(s))
     {
         printf("增加失败\n");
         return 0;
     }
     strcpy(s->stu.name,a);
     s->stu.age=b;
     s->len++;
     return 1;
 }
 
 //顺序表遍历
 void seq_show(seqListPtr s)
 {
     if(NULL==s||empty(s))
     {
         printf("遍历失败\n");
         return;
     }
     else
     {
         for(int i=0;i<s->len;i++)
         {
             printf("%s %d ",s->stu.name,s->stu.age);
         }
         putchar(10);
     }
 }

main文件

#include "sequence.h"

int main()
{
    //创建顺序表
    seqListPtr s=seq_create();
    printf("%p\n",s);

    //判满
    full(s);

    //增加数据
    seq_add(s,"张三",24);
    seq_add(s,"李四",32);
    seq_show(s);                   
    //判空
    empty(s);
    
}
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值