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);
}