1.什么是线性表?
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的
它的逻辑结构:
它的:存储结构:
线性表的顺序存储结构——————顺序表
把线性表的所有元素按照逻辑顺序依次存储在
存储位置开始的一块连续的存储空间中
2.顺序表的基本运算:
建立线性表
判断线性表是否空表
线性表的长度
查找某个数据元素的值
插入数据元素
删除数据元素
输出数据元素
typedef struct { //typedef这个就是把struct{} 当作SqList.
//SqList就是结构体
ElemType data[MaxSize];
int length;
}SqList; //这个SqList 代替了struct{}.
//之后可以直接用 SqList定义变量
//,不是主函数和次函数都可以改变结构体的值
void InitList(SqList*& L) //参数是:定义了结构体变量,初始化结构体
//存储空间和数据的值
{
L = (SqList*)malloc(sizeof(SqList)); //存储空间,sizeof(); malloc
L->length = 0; // 使顺序表的长度为0,给data[MaxSize],添加元素,这个长度就加一
}
插入值:给结构体成员变量数组赋值:data
bool ListInsert(SqList* L, int i, ElemType e) //i是位置,e是数据元素
{
int j;
if (i<1 || i>L->length + 1 || L->length == MaxSize)
return false;
i--; // 为啥i-1,i是顺序表位置,
//i--时, 就是,data中的数组元素位置
//这里注意:第一个位置1时,赋值的data数组是data[0], .
for (j = L->length; j > i; j--) //j=0,j<i, 不会
L->data[j] = L->data[j - 1];// abcde : i=3, l->length=5,j=5 ,这一步后移
//使插入的i后面的data[i]都向后移一步 ,如果插入的位置后面有元素的话
L->data[i] = e; //赋值
L->length++; //赋值后使长度加一
return true;
}
SqList * L;//主函数的结构体指针变量。,指针就可以指向结构体的值。(但是要指向结构体的地址才能指向结构体数据)
void CreateLise(SqList*& L, ElemType a[], int n)//这个
//SqList*& L这个的写法:这个L是指针,结构体指针需要找到结构体的地址,所以需要地址符&。引用,没有这个,指针指向不了结构体的数据的。
//
代码:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef char ElemType; //typedef :转换
typedef struct {
ElemType data[MaxSize];
int length;
}SqList; //全局变量
void CreateLise(SqList*& L, ElemType a[], int n)
{
L = (SqList*)malloc(sizeof(SqList));
for (int i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
void InitList(SqList*& L) //这里的L字母可以改变,T,y不影响数据,
//因为跟传入的指针有关
{
L = (SqList*)malloc(sizeof(SqList)); //存储空间,sizeof(); malloc
L->length = 0;
}
void DestroyList(SqList*& L)
{
free(L); //销毁
}
bool ListEmpty(SqList* L)
{
return(L->length == 0);
}
int ListLength(SqList* L)
{
return(L->length);
}
void DispList(SqList* L)
{
for (int i = 0; i < L->length; i++)
printf("%c", L->data[i]);
printf("\n");
}
bool GetElem(SqList* L, int i, ElemType& e)
{
if (i<1 || i>L->length)
return false;
e = L->data[i - 1];
return true;
}
int LocateElem(SqList* L, ElemType e)
{
int i = 0;
while (i < L->length&& L->data[i] != e)
i++; //i++
if (i >= L->length)
return 0;
else
return i + 1; //i+1是位置
}
bool ListInsert(SqList* L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length + 1 || L->length == MaxSize)
return false;
i--; //i-1
for (j = L->length; j > i; j--) //j=0,j<i, 不会
L->data[j] = L->data[j - 1];// abcde : i=3, l->length=5,j=5
//
L->data[i] = e; //赋值
L->length++; //赋值后使长度加一
return true;
}
bool ListDelete(SqList*& L, int i, ElemType& e)
{
int j;
if (i<1 || i>L->length)
return false;
i--;
e = L->data[i];
for (j = i; j < L->length - 1; j++)
L->data[j] = L->data[j + 1];
L->length--;
return true;
}
int main(){
SqList * L;
ElemType e;
int i;
char a[5];
for (i = 0; i < 5; i++)
scanf("%c", &a[i]); /改变值
printf("顺序表的基本运算如下:\n");
printf("(1)初始化顺序表L\n");
InitList(L); //
printf("(2)依次插如a,b,c,d,e元素\n");
ListInsert(L, 1, a[0]); //qsdte
ListInsert(L, 2, a[1]);
ListInsert(L, 3, a[2]);
ListInsert(L, 4, a[3]);
ListInsert(L, 5, a[4]);
printf("(3)输出顺序表L:");
DispList(L); //输出元素
printf("(4)顺序表L长度:%d\n", ListLength(L));
printf("(5)顺序表L为%s\n", (ListEmpty(L) ? "空" : "非空"));
GetElem(L, 3, e);
printf("(6)顺序表L的第3个元素:%c\n", e);
printf("(7)元素a的位置:%d\n", LocateElem(L, 'a'));
printf("(8)在第4个位置上插入f元素\n");
ListInsert(L, 4, 'f'); //
printf("(9)输出顺序表L:"); DispList(L);
printf("(10)删除L的第3个元素\n");
ListDelete(L, 3, e);
printf("(11)输出顺序表L:"); DispList(L);
printf("(12)释放顺序表L\n");
DestroyList(L);
return 1;
}
效果图:
总结:
1.分配存储空间:malloc
2.删除一个元素,这个元素的后面往前面移动一步
3.插入一个元素,这个元素后面往后面移动一步
4.所有的次函数都是对全局:结构体的数据修改和引用数据
5.查找元素的位置,就是返回这个元素对应的data[i]元素,
i+1就是元素的位置