c语言动态存储顺序表,数据结构—顺序表基本操作(c语言代码)

顺序表

计算机内部存储一张线性表是用一组连续地址内存单元,这种存储结构即为顺序存储结构,这种结构下的线性表叫顺序表。

a355fd7326ad7dd3758415f2d824aab4.png

顺序表有两种定义方法:

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值