从本章开始正式进入数据结构学习...... ()
1.线性表的定义
Definition:零个或多个数据元素的有限序列。
特点:
它是一个序列:
数据之间是有序的
数据元素之间是一对一的关系
有限性:
线性表的数据元素个数是有限的。
注意:零个数据元素的有限序列又被称为空表
操作:
1.创建和初始化 2.插入 3.查找 4.删除 5.清空
ADT 线性表(SequenceList)
Data
1.线性表数据元素是一个集合{a_1, a_2, a_3, ... , a_n}, 数据元素的类型DataType
2.前驱(除了第一个元素a_1外,每个元素有且只有一个直接的前驱元素)
3.后继(除了最后一个元素a_n外,每个元素有且只有一个直接的后继元素)
4.每个数据元素之间的关系是一一对应的关系
Operation
InitList( *List) //初始化线性表,创建一个空的线性表List
Insert( *List, index, elem) //在线性表List的index下标处插入元素elem
Delete( *List, index, *elem) //删除线性表List中第index个元素,并返回删除元素的指针elem
GetLength( *List)
IsEmpty( *List)
ClearList( *List)
GetElement( *List, index, *elem)
endADT
2.线性表的存储结构
线性表为顺序存储的数据结构,其顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素
3.描述线性表的顺序存储结构的三个属性
1.需要定义线性表的最大存储空间
#define Max_SIZE 255
2.需要有统一类型的元素集合
typedef struct{
int id;
char * name;
}ElementType;
3.定义顺序表结构
typedef struct{
ElementType datas[ MAX_SIZE ];
int length;
};
Note:以后约定
position 位置, 从1开始
index 下标, 从0开始
4.代码实现线性表实例
//定义数据元素,顺序表结构
#ifndef DATAELEMENT_H_INCLUDED
#define DATAELEMENT_H_INCLUDED
/**********************************************************
* Project: SequenceList
* Function: Define DataElement
* Description: None
* @Author: Uchiha-Akali
**********************************************************
* Copyright @ 2019 by Uchiha-Akali
*********************************************************/
#include <stdio.h>
#define MAX_SIZE 255
// 定义数据元素
typedef struct{
int id;
char * name;
}ElementType;
//定义顺序表结构
typedef struct{
ElementType datas[MAX_SIZE]; //顺序表中的数据元素集合
int length; //当前顺序表中的元素个数
}SeqList;
#endif // DATAELEMENT_H_INCLUDED
//函数声明
#ifndef SEQUENCELIST_H_INCLUDED
#define SEQUENCELIST_H_INCLUDED
/**********************************************************
* Project: SequenceList
* Function:
* Description: None
* @Author: Uchiha-Akali
**********************************************************
* Copyright @ 2019 by Uchiha-Akali
*********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "DataElement.h"
/**
*初始化顺序表
*@param seqList 要初始化的顺序表
*@param elemArray 初始化时要添加的元素内容数组
*@param length 初始化时添加的元素个数
**/
void InitList(SeqList * seqList, ElementType * elemArray, int length);
/**
* 向顺序表中的index下标处插入某个元素
* @param seqList
* @param index 要插入的下标
* @param element 要插入的元素
*/
void InsertElement(SeqList * seqList, int index, ElementType element);
void PrintList(SeqList * seqList);
#endif // SEQUENCELIST_H_INCLUDED
//函数实现
#include "SequenceList.h"
#include <stdio.h>
#include <stdlib.h>
/**********************************************************
* Project: SequenceList
* Function:
* Description: None
* @Author: Uchiha-Akali
**********************************************************
* Copyright @ 2019 by Uchiha-Akali
*********************************************************/
void InitList(SeqList * seqList, ElementType * elemArray, int length)
{
if(length > MAX_SIZE)
{
printf("超出了数组的最大容量,初始化失败!\n");
return;
}
seqList->length = 0; //记得在初始化顺序表时,将顺序表的长度置零
for(int i = 0; i < length; i++)
{
//每次循环都在下标为i的位置插入一个元素
InsertElement(seqList, i, elemArray[i]);
}
}
void InsertElement(SeqList * seqList, int index, ElementType element)
{
//1、验证插入后的元素空间是否超过MAX_SIZE
//2、index的值是否合法[0, MAX_SIZE-1]
//3、插入的index应该在length之内
//4、从第length-1个下标开始,前面一个元素赋值给后面一个元素
if(seqList->length + 1 >= MAX_SIZE)
{
printf("数组已满,插入元素失败!\n");
return;
}
if(index < 0 || index > MAX_SIZE - 1)
{
printf("只能在允许的下标范围内插入元素[0, %d]\n", MAX_SIZE - 1);
return;
}
if(index > seqList->length)
{
printf("插入的下标超过了数组的最大长度-1,插入失败!\n");
return;
}
//在C89标准中不允许在for中直接定义变量
//C99中以后就允许了
for(int i = seqList->length - 1; i >= index; i--)
{
seqList->datas[i + 1] = seqList->datas[i];
}
//5、将要插入的值赋给第index个元素
seqList->datas[index] = element;
//6、顺序表的总长度+1 !!!! - 非常容易漏掉的地方
seqList->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 );
}
}
//主函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DataElement.h"
//测试数据
ElementType dataArray[] = {
{1, "诺手"},
{2, "剑魔"},
{3, "卡莎"},
{4, "皇子"},
};
void TestSequenceList();
int main()
{
void TestSequenceList();
return 0;
}
void TestSequenceList()
{
SeqList seqList; //要操作的顺序表
InitList(&seqList, dataArray, sizeof(dataArray) / sizeof(dataArray[0]));
PrintList(&seqList);
}