线性表的简介
线性表是最常用的且最简单的一种数据结构。简而言之,一个线性表是n个数据元素的有限序列。至于每个数据函数的具体含义,在不同的情况下各不相同,它可以是一个数或一个符号,也可以是一本书,甚至其他更复杂的信息。
在复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件。
线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
假设线性表的每个元素需要占用L个存储单元,并且将第一个单元的存储位置作为数据原数的存储位置。则线性表中第i+1个数据元素和第i个数据元素的位置关系是:Loc(i+1)=Loc(i)+L。
##线性表的动态分配顺序存储结构
#define list_init_size 100 //线性表的存空间的初始量
#define listaddsize 10 //线性表存储空间的增量
typedef struct {
elemtype *elem; //存储空间的首地址
int length; //当前长度
int listsize; //当前分配量的存储容量,以sizeof(elem)为单位的
}sqlist
status initlist(sqlist &L){
//构造一个空的线性表
L.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));
if(!L.elem) //存储分配失败
exit(overflow);
L.length=0; //空表长度为0
L.listsize=list_init_size;
return ok;
} //initlistsq
线性表的插入和删除操作
相对于C语言的数组的下标是从0开始的,而L的数据类型要是SQlist类型的顺序表,则表中的第i个元素是L[i-1]。
插入操作
status listinsert_sq(sqlist &L,int i,elemtype e) //在顺序线性表L中的第i个位置插入元素e,i的合法区间1<=i<=L.lengthsq(L)+1
{
if(i<1||i>L.length+1) //i值不合法
return error;
if(L.length>=L.list.size) //当前的存储空间满了
{
newbase=(elemtype*)realloc(L.elem,(L.listsize+L.listaddsize)*sizeof(elemtype));
if(!newbase)
exit(overflow); //储存分配失败
L.elem=newbase; //新基址
L.listsize+=listaddsize; //增加的存储量
}
q=&L.elem[i-1]; //q是插入的位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p; //插入后元素右移
*q=e; //插入e
++L.length;
return ok;
}
删除操作
status listdelete_sq(sqlist &L,int i,elemtype &e) //在顺序线性表L中删除第i个位置元素,并且用e返回,i的合法区间1<=i<=L.lengthsq(L)
{
if(i<1||i>L.length+1) //i值不合法
return error;
p=&(L.elem[i-1]); //p为被删除的元素
e=*p; //被删除的元素赋值给e
q=L.elem+L.length-1; //表尾位置
for(++p;p<=q;++p)
*(p-1)=*p; //被删除元素后元素左移
--L.length;
return ok;
}
上列抽象数据类型的C语言化
#include<stdio.h>
#include<windows.h>
#define list_init_size 100 //线性表的存空间的初始量
#define listaddsize 10 //线性表存储空间的增量
typedef struct xianxingbiao{
int *elem; //存储空间的首地址
int length; //当前长度
int listsize; //当前分配量的存储容量,以sizeof(int)为单位的
}sqlist;
int initlist(sqlist *L);
int listinsert_sq(sqlist *L,int i,int e);
int listdelete_sq(sqlist *L,int i);
int initlist(sqlist *L)
{
//构造一个空的线性表
L->elem=(int*)malloc(list_init_size*sizeof(int));
if(!L->elem) //存储分配失败
exit(-1);
L->length=0; //空表长度为0
L->listsize=list_init_size;
return 0;
} //initlistsq
int listinsert_sq(sqlist *L,int i,int e) //在顺序线性表L中的第i个位置插入元素e,i的合法区间1<=i<=L.lengthsq(L)+1
{
int *p,*q,*newbase;
if(i<1||i>L->length+1) //i值不合法
return -1;
if(L->length>=L->listsize) //当前的存储空间满了
{
newbase=(int*)realloc(L->elem,(L->listsize+listaddsize)*sizeof(int));
if(!newbase)
exit(-1); //储存分配失败
L->elem=newbase; //新基址
L->listsize+=listaddsize; //增加的存储量
}
q=&L->elem[i-1]; //q是插入的位置
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p; //插入后元素右移
*q=e; //插入e
++L->length;
return 0;
}
int listdelete_sq(sqlist *L,int i) //在顺序线性表L中删除第i个位置元素,并且用e返回,i的合法区间1<=i<=L.lengthsq(L)
{
int *p,*q;
int e;
if(i<1||i>L->length+1) //i值不合法
return -1;
p=&(L->elem[i-1]); //p为被删除的元素
e=*p; //被删除的元素赋值给e
q=L->elem+L->length-1; //表尾位置
for(++p;p<=q;++p)
*(p-1)=*p; //被删除元素后元素左移
--L->length;
return e; //把删除元素给返回出来
}
int main()
{
int d;
sqlist *a;
initlist(*a);
listinsert_sq(*a,1,2);
d=listdelete_sq(*a,1,e);
printf("%d",d);
return 0;
}
有点问题,E:\练习\c练习\2021.4.3.c|61|error: expected expression before ‘sqlist’|,这是为啥,麻了。
感觉
个人问题,在一开始学的时候看不懂那些抽象的表达代码,感觉要想学会,至少要先弄明白那些抽象的代码啥意思。