chapter two -2-1顺序表插入 & 2-2 顺序表初始化

2-1 线性表抽象数据类型

线性表

  • 定义:0个 or 多个数据元素的有限序列

  • 特点:
    是一个序列 元素之间是有序的 数据元素 之间是 一对一的关系
    有限性: 线性表的数据元素的个数是有限的 (食物链中生物的个数是有限的)

  • 常见的操作
    创建和初始化 、 查找 、 插入 、 删除(增删改查)
    线性表表达:

ADT 线性表(SequenceList) //线性表
Data 
    1、线性表的数据元素是一个集合 {a_1,a_2,a_3...,a_n}, 数据元素的类型DataType{int,char,自定义}
    2、前驱 除了第一个元素a_1外每个元素只有一个直接的前驱元素
    3、后继 除了最后一个元素a_n外,每个元素只有一个直接的后继元素
    4、每个数据元素之间的关系是一对一的关系
Operation
    InitList( *List )                                   //初始化线性表
    InsertElement(*List , index , elem)  //在线性表List 的index下标处插入元素elem       
    DeleteElement(*List, index, *elem)  //删除线性表List中第i个元素 并返回删除元素的指针e
    GetLength(*List)                            //得到长度
    IsEmpty(*List)                              //判断是否为空
    ClearList(*List)                            //清空顺序表
    GetElement(*Liset,index , *elem) //得到指定位置的元素
    
endADT

2-2顺序存储结构的线性表 —— 顺序表

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

描述线性表的顺序存储结构需要三个属性:1. 线性表最大容量 2. 线性表的当前长度 3。存储空间的起始位置

1. 我们需要定义线性表的最大存储空间
#define MAX_SIZE 255
2. 线性表里需要有同一类型的元素集合
typedef int ElemType //这种是给int取了一个别名,其目的是用ElemType自带int 
同理:下面也是这种思想
typedef struct{
    int id,
    char* name;
}ElementType
3、定义顺序表结构
typedef srtuct{
    ElementType datas[ MAX_SIZE] ;
    int length ;
}SeqList;

地址计算方法

约定:
position:表示元素位置 从1开始
index:表示索引下标 从0开始

从0开始实现线性表

1)全局数据结构的头文件 “DataElement.h”
#ifndef DATAELEMENT_H_INCLUDED
#define DATAELEMENT_H_INCLUDED
/***********************************************************************
 *  Project:数据结构第二章案例
 *  Function:用来定义数据元素
 *  Author:chillinght
 *
 ***********************************************************************
 *  Copyright:2019 by chillinght
 ***********************************************************************
 */
 #define MAX_SIZE 255
//1、定义数据元素
//typedef int ElementType;
/*
 *datas = {{1,""},{2,""},{3,""}};
 */
typedef struct{
   int id;
   char *name;
 }ElementType;

 //2、定义顺序表结构
 typedef struct{
    ElementType datas[MAX_SIZE];//顺序表中的元素集合
    int length;                 //当前顺序表中元素的个数
 }SeqList;


#endif // DATAELEMENT_H_INCLUDED

2)定义线性表的独有的数据头文件 “SequenceList.h”
#ifndef SEQUENCELIST_H_INCLUDED
#define SEQUENCELIST_H_INCLUDED
/**< 用来定义顺序表的头文件 其中包括方法的定义 */
#include <stdio.h>
#include <stdlib.h>
#include "DataElement.h"

//下面定义顺序表的方法
// 1 初始化 顺序表:需要参数:顺序表头指针、 初始化的元素类型 、 初始化顺序表长度
/**
 * 初始化顺序表
 * @param seqList       要初始化的顺序表名(数组名也就是头指针)
 * @param elemArray     初始化时要添加的元素内容数组
 * @param length        初始化时添加的元素个数
 */
void InitList(SeqList * seqlist, ElementType * elemArray, int length);
// 2 插入 参数:顺序表头指针 、 插入元素类型 、 插入元素位置position/索引值index
/**
 * 向顺序表插入元素
 * @param seqList       顺序表名(数组名也就是头指针)
 * @param index         插入元素下标
 * @param element       元素内容
 */
void InsertElement(SeqList* seqlist,int index,ElementType element );
//3 打印顺序表
void PrintList(SeqList* seqlist);

#endif // SEQUENCELIST_H_INCLUDED

头文件的实现文件(包括其中定义的函数:插入、删除、初始化、打印) “SequenceList.c”
#include "SequenceList.h"

//下面实现顺序表的方法
// 1 初始化 顺序表:需要参数:顺序表头指针、 初始化的元素类型 、 初始化顺序表长度
/**
 * 初始化顺序表
 * @param seqList       要初始化的顺序表名(数组名也就是头指针)
 * @param elemArray     初始化时要添加的元素内容数组
 * @param length        初始化时添加的元素个数
 */
void InitList(SeqList * seqlist, ElementType * elemArray, int length)
{
    //1 验证传入的length是否超出了max_size 的范围
    //2 调用插入函数进行初始化
    if(length > MAX_SIZE){
        printf("插入的长度太大,请减小length的长度");//这里突然想到 length在main中应该和elemArray长度一样
        return;
    }
    //记得在插入前将 顺序表中的length 置0 否则插入位置不确定
    seqlist->length = 0;
    for(int i = 0; i < length; i++)
    {
        InsertElement(seqlist,i,elemArray[i]);
    }
}

// 2 插入 参数:顺序表头指针 、 插入元素类型 、 插入元素位置position/索引值index
/**
 * 向顺序表插入元素
 * @param seqList       顺序表名(数组名也就是头指针)
 * @param index         插入元素下标
 * @param element       元素内容
 */
void InsertElement(SeqList* seqlist,int index,ElementType element )//其实就是向数组中插入一个元素
{
    //1、验证插入后的元素空间是否超过MAX_SIZE
    //2、index的值是否合法[0,MAX_SIZE - 1]
    //3、插入的index 应该在length 之内
    //4、从后向前第 length - 1 的index位置开始 到index 前面一个元素赋值给后面一个元素。
    //5、将插入的元素赋值给index下标的元素
    //6、顺序表总长度+1
    if(seqlist->length + 1 > MAX_SIZE){
        printf("插入后数据溢出,数组已满,插入失败\n");
        return;
    }
    if(index < 0 || index > MAX_SIZE || index >seqlist->length){
        printf("index数值不合法,请在合法的下标范围[0,%d]内进行插入\n",seqlist->length);
        return;
    }
    for(int i = seqlist->length - 1;i > index - 1;i--)
    {
        seqlist->datas[i+1] = seqlist->datas[i];
    }
    seqlist->datas[index] = element;
    seqlist->length += 1;
}
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);
    }
}

测试用例 "main.c"中
#include <stdio.h>
#include <stdlib.h>
#include "SequenceList.h"
#include "DataElement.h"
//测试一下~
void TestSequenceList();


int main()
{
    TestSequenceList();
    return 0;
}
void TestSequenceList()
{
    ElementType dataArray[] = {
    {1,"海绵宝宝"},
    {2,"派大星"},
    {3,"章鱼哥"},
    {4,"蟹老板"},
    {5,"痞老板"}
    };
    SeqList seqlist;
    InitList(&seqlist,dataArray,sizeof(dataArray) / sizeof(dataArray[0]));
    PrintList(&seqlist);
}

测试用例结果

[外链图片转存失败(img-8zJQyghp-1569236874510)(en-resource://database/898:1)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值