顺序表
计算机内部存储一张线性表是用一组连续地址内存单元,这种存储结构即为顺序存储结构,这种结构下的线性表叫顺序表。
顺序表有两种定义方法:
1.静态定义
2.动态生成
顺序表是最简单的一种线性存储结构,优点:构造简单,操作方便,通过顺序表的首地址(或数组名)可直接对表进行随机存取
缺点:可能浪费存储空间,插入或者删除时候需要对后边一系列的数据进行操作,效率低
下面举两个实例并附上c语言代码+注释来理解
静态顺序表/********************************************************************************
创建一个静态的顺序表存放整数,大小为10,完成以下的操作
1.输入6个整数,打印出顺序表的内容,并显示表中剩余空间的个数
2.在顺序表的第三个位置处插入元素0,打印出表中的内容,并显示空间中剩余的个数
3.再试图插入表中第11个位置整数0,程序提示超出范围
4.删除表中第6个元素,最后显示空间中剩余的个数
*********************************************************************************/
#include
#include
#define MaxSize 10
/** 函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */
/** 向顺序表中插入元素 */
/** 参数Sqlist:表首地址 */
/** 参数*len:表的长度 */
/** 参数i:插入元素的位置 */
/** 参数x:待插入的元素值 */
void insertElem(int Sqlist[] , int *len , int i , int x)
{
int t;
if(*len==MaxSize || i<1 || i>*len+1) //长度为len的顺序表可插入的位置为1-len+1 其余的还有表已满的情况均超出范围
{
printf("非法插入\n");
return;
}
for(t = *len-1 ; t>=i-1 ; t--)
Sqlist[t+1] = Sqlist[t]; //将i-1后的元素顺序后移一个元素的位置
Sqlist[i-1] = x; //插入元素
*len = *len+1; //表长加1
}
/** 函数inserElem的作用:顺序表Sqlist第i个位置上插入元素x,并将长度加1 */
/** 向顺序表中删除元素 */
/** 参数Sqlist:表首地址 */
/** 参数*len:表的长度 */
/** 参数i:插入元素的位置 */
void DelElem(int Sqlist[] , int *len , int i)
{
int j;
if(i<1 || i>*len)
{
printf("非法删除\n");
return;
}
for(j =i ; j<=*len-1 ; j++)
Sqlist[j-1] = Sqlist[j];
*len = *len-1;
}
/** 测试函数 根据题目要求 */
int main()
{
int Sqlist[MaxSize];
int len;
int i;
for(i = 0 ; i<6 ; i++)
{
scanf("%d",&Sqlist[i]);
}
len = 6;
for(i= 0 ; i
printf("%d\t",Sqlist[i]);
printf("\n剩余空间为%d\n" , MaxSize - len);
insertElem(Sqlist , &len , 3 , 0); //表中第三个位置插入整数0
for(i= 0 ; i
printf("%d\t",Sqlist[i]);
printf("\n剩余空间为%d\n" , MaxSize - len);
insertElem(Sqlist , &len , 11 , 0); //表中第11个位置插入0
DelElem(Sqlist , &len , 6); //删除第六个元素
for(i= 0 ; i
printf("%d\t",Sqlist[i]);
printf("\n剩余空间为%d\n" , MaxSize - len);
return 0;
}动态顺序表
/********************************************
*动态的创建一个顺序表
*初始长度10,向顺序表中输入15个整数,并打印
*再删除顺序表中的第五个元素,打印出结果
********************************************/
#include
#include
#define MaxSize 10
#include
/* 定义一个结构体Sqlist */
typedef struct{
int *elem; //指向顺序表的首地址
int length;//顺序表中表的长度(表中元素的个数)
int listsize;//顺序表存储空间容量
}Sqlist;
/* 通过一个函数initSqlist实现动态的生成一个顺序表 初始化一个顺序表 */
/* 参数L:Sqlist类型的指针因为是指针所以可以在函数中直接对顺序表进行操作 */
void initSqlist(Sqlist *L){
//调用malloc函数动态分配一段空间,并将空间首地址赋给L的elem成员,L->elem指向顺序表的首单元
L ->elem = (int *)malloc(MaxSize*sizeof(int));
if(!L ->elem)exit(0);
L -> length = 0;//置0表示表空 刚生成
L -> listsize = MaxSize;//置MaxSize 表示空间大小
}//Sqlist类型的变量L就代表了一张顺序表 可以灵活操作 L->elem头地址 L->length长度 L->MaxSize容量
/********************
*向顺序表中插入元素
*参数L :Sqlist类型的指针
*参数i:插入元素的位置
*参数item:插入的元素
*********************/
void InsertElem(Sqlist *L, int i, int item){
//向顺序表L中的第i个位置插入元素item
int *base, *insert_ptr, *p;
if(i < 1 || i > L->length+1)exit(0);//非法插入 退出
if(L->length >= L->listsize)
{
//realloc函数重新追加空间 ******动态顺序表的优势******** 静态顺序表内存大小固定不变 动态可以随时扩充
base = (int *)realloc(L->elem, (L->listsize +10)*sizeof(int));
L->elem = base;//更新内存基址
L->listsize = L->listsize + 100;//内存空间增大100单元
}
insert_ptr = &(L ->elem[i-1]);//insert_ptr为插入位置
for(p = &(L ->elem[L->length-1]); p >= insert_ptr; p--)
*(p+1) =* p;//将i-1后的元素顺序后移一个元素的位置
* insert_ptr = item;//在第i个位置上插入元素item
L->length++;//表长+1
}
/********************
*从顺序表中删除元素
*参数L :Sqlist类型的指针
*参数i:删除元素的位置
*********************/
void DelElem(Sqlist *L, int i)
{
//从顺序表L中删除第i个元素
int *delitem, *q;
if(i < 1 || i > L->length)exit(0);//非法删除
delitem = &(L->elem[i-1]);//delitem指向第i个元素
q = L->elem + L->length-1;//q指向表尾
for(++delitem; delitem <= q; ++delitem)*(delitem-1) =* delitem;//将第i位置以后的元素依次前移
L->length--;//表长-1
}
/********************
*测试函数
*********************/
int main()
{
Sqlist l;
int i;
initSqlist(&l);
printf("表中数据:");
for(i =0; i<15; i++)
InsertElem(&l, i+1, i+1);
for(i = 0; i
printf("%3d",l.elem[i]);
printf("\n删除后的结果:");
DelElem(&l, 5);
for(i = 0; i
printf("%3d",l.elem[i]);
getche();
return 0;
}