废话不多话先上代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct
{
char *elem;
int length;
}SqList;
//线性表初始化
void InitList_Sq(SqList *p)
{
p->elem=(char*)malloc(sizeof(char)*MAXSIZE);
p->elem[0]='A';
p->elem[1]='B';
p->elem[2]='C';
p->elem[3]='D';
p->elem[4]='E';
p->length=5;
printf("线性表初始化成功\n");
}
//销毁线性表
void DestroyList(SqList *p)
{
if(p->elem)
{
free(p->elem);
}
printf("线性表已经摧毁\n");
}
//清除线性表
void ClearList(SqList *p)
{
p->length=0;
printf("线性表已经清除\n");
}
//获取线性表的长度
int GetLength(SqList *p)
{
int a;
a=(p->length);
return (a);
}
//判断线性表是否为空
void IsEmpty(SqList *p)
{
if((p->length)==0)
{
printf("线性表为空\n");
}
else
{
printf("线性表不为空\n");
}
}
//获取某一位数据
char GetElem(SqList *p,int i)
{ char a;
if(i<1||i>(p->length))
{
printf("获取数据失败,不在数据范围内\n");
}
else
{
a=(p->elem[i-1]);
printf("获取数据成功\n");
return a;
}
}
//定位某一个数据在线性表中的位置
int LocateElem(SqList *p,char b)
{
for(int i=0;i<(p->length);i++)
{
if(p->elem[i]==b)
{
printf("查到到该元素\n");
return i+1;
}
}
printf("未查到该元素\n");
return 0;
}
//插入某一个元素
void ListInsert_Sq(SqList *p,int i,char a)
{
if(i<1||i>p->length+1)
{
printf("插入的位置不合法");
}
else
{
if(p->length==MAXSIZE)
{
printf("线性表已满无法插入\n");
}
else
{
for(int j=p->length;j>=i-1;j--)
{
p->elem[j]=p->elem[j-1];
p->elem[i-1]=a;
p->length++;
printf("插入数据成功\n");
}
}
}
}
//删除某一个位置数据
void ListDelete_Sq(SqList *p,int i)
{
if(i<1||i>p->length)
{
printf("删除的位置不合法\n");
}
else
{
if(p->length==0)
{
printf("线性表已空无法删除\n");
}
else
{
for(int j=i-1;j=p->length-1;j++)
{
p->elem[j]=p->elem[j+1];
p->length--;
}
printf("该位置的元素已经被删除\n");
}
}
}
int main()
{ int a;
char b;
SqList L1;
SqList *L=&L1;
InitList_Sq(L);
IsEmpty(L);
ListInsert_Sq(L,6,'G');
a=GetLength(L);
printf("%d\n",a);
ListDelete_Sq(L,6);
b=GetElem(L,6);
printf("%c",b);
DestroyList(L);
}
这几天学习了一下顺序结构的线性表,并用c语言实现,首先十分感谢b站的王卓老师的数据结构课,讲的真的很好。
先来分享一下我自己的理解,这次是顺序结构的线性表,在逻辑上的两个元素挨着的话,在物理上也是挨着的,用数组实现。
线性表的初始化
typedef struct
{
char *elem;
int length;
}SqList;
//线性表初始化
void InitList_Sq(SqList *p)
{
p->elem=(char*)malloc(sizeof(char)*MAXSIZE);
p->elem[0]='A';
p->elem[1]='B';
p->elem[2]='C';
p->elem[3]='D';
p->elem[4]='E';
p->length=5;
printf("线性表初始化成功\n");
}
这上面定义了一个的结构体,typedef是一个重定义,大家不懂的话可以先去学习一个这个typedef,线性表的初始化就是将元素存储在数组上,将逻辑上上挨着的两个元素,由于数组也是一个挨着一个,就可以体现逻辑。
销毁线性表
void DestroyList(SqList *p)
{
if(p->elem)
{
free(p->elem);
}
printf("线性表已经摧毁\n");
}
上面初始化的结构体里定义了两个变量一个是数组,一个是length用来存取线性表的长度;我们这里用了free函数,也就是将申请到的地址给释放了,也就是将线性表销毁。
清除线性表
void ClearList(SqList *p)
{
p->length=0;
printf("线性表已经清除\n");
}
我们将length置0,线性表的长度就为0,可能还有一个疑问,呢数据不还是还在吗?,但这是数组如果你继续赋值数组里面的值将会被覆盖。
获取线性表的长度
int GetLength(SqList *p)
{
int a;
a=(p->length);
return (a);
}
即返回length的值。
判断线性表是否为空
void IsEmpty(SqList *p)
{
if((p->length)==0)
{
printf("线性表为空\n");
}
else
{
printf("线性表不为空\n");
}
}
也就是length的值是否为空
获取某一个数据
char GetElem(SqList *p,int i)
{ char a;
if(i<1||i>(p->length))
{
printf("获取数据失败,不在数据范围内\n");
}
else
{
a=(p->elem[i-1]);
printf("获取数据成功\n");
return a;
}
}
利用数组这个很容易获取,注意数组是从0开始的。
定位元素的位置
int LocateElem(SqList *p,char b)
{
for(int i=0;i<(p->length);i++)
{
if(p->elem[i]==b)
{
printf("查到到该元素\n");
return i+1;
}
}
printf("未查到该元素\n");
return 0;
}
就是将数组中的元素全部遍历一遍。
插入一个元素
void ListInsert_Sq(SqList *p,int i,char a)
{
if(i<1||i>p->length+1)
{
printf("插入的位置不合法");
}
else
{
if(p->length==MAXSIZE)
{
printf("线性表已满无法插入\n");
}
else
{
for(int j=p->length;j>=i-1;j--)
{
p->elem[j]=p->elem[j-1];
p->elem[i-1]=a;
p->length++;
printf("插入数据成功\n");
}
}
}
}
如果我们插入一个数据,那么我们就要进行其移位就是从最后开始移动,然后在插入这个元素,同时length加1。
删除某个元素
void ListDelete_Sq(SqList *p,int i)
{
if(i<1||i>p->length)
{
printf("删除的位置不合法\n");
}
else
{
if(p->length==0)
{
printf("线性表已空无法删除\n");
}
else
{
for(int j=i-1;j=p->length-1;j++)
{
p->elem[j]=p->elem[j+1];
p->length--;
}
printf("该位置的元素已经被删除\n");
}
}
}
如果我们是删除就要从删除的这个位置,将后面的元素往前移。同时length的值-1.