首页 > 编程知识 正文

数据结构顺序表的实现代码,数据结构顺序表的基本操作代码

时间:2023-05-03 20:17:37 阅读:190484 作者:572

存储在顺序表计算机内部的线性表使用一系列的连续地址存储单元,这种存储结构是顺序存储结构,这种结构下的线性表称为顺序表。

顺序表有两种定义方法。

1 .静态定义

2 .动态生成

顺序表是最简单的线性存储结构,具有结构简单、操作容易、可以从顺序表的起始地址(或数组名称)直接随机访问表的优点

缺点:可能会浪费存储空间,插入和删除时需要操作后面的一系列数据,效率低下

下面举两个实例并附上c语言代码+注释来理解

静态顺序表

/* * * * * * * * * * * * * * * * * * * * * *然后显示表中剩余空格个数2 .在顺序表的第三个位置插入元素0,打印表中的内容,打印空格函数inserElem的作用:在顺序表Sqlist的第I个位置插入元素x,加上长度1*/**,元素*//**参数Sqlist:表的起始地址*/**参数*len: 参数x :要插入的元素值*/void insing if (* len==maxsize|| i1|| I * len1) /长度为len的顺序表的可插入位置为1-len 1,此外表已满时也不在范围内返回; }for(t=*Len-1; t=i-1; t--; sqlist[t1]=sqlist[t]; //I-1之后的元素按顺序向后一个元素的位置移动Sqlist[i-1]=x; //插入要素*len=*len 1; ///表长1}/**函数inserElem的作用:在序列图Sqlist的第I个位置插入元素x,加上长度1 *//**,从序列图中选择元素*/*参数Sqlist:表的起始地址** 返回; (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<len ; i++) printf("%dt",Sqlist[i]); printf("n剩余空间为%dn" , MaxSize - len); insertElem(Sqlist , &len , 3 , 0); //表中第三个位置插入整数0 for(i= 0 ; i<len ; i++) printf("%dt",Sqlist[i]); printf("n剩余空间为%dn" , MaxSize - len); insertElem(Sqlist , &len , 11 , 0); //表中第11个位置插入0 DelElem(Sqlist , &len , 6); //删除第六个元素 for(i= 0 ; i<len ; i++) printf("%dt",Sqlist[i]); printf("n剩余空间为%dn" , MaxSize - len); return 0;} 动态顺序表


/******************************************** *动态的创建一个顺序表 *初始长度10,向顺序表中输入15个整数,并打印 *再删除顺序表中的第五个元素,打印出结果 ********************************************/ #include<stdio.h>#include<conio.h>#define MaxSize 10#include<bits/stdc++.h>/* 定义一个结构体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个位置插入元素itemint *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<l.length; i++)printf("%3d",l.elem[i]);printf("n删除后的结果:");DelElem(&l, 5);for(i = 0; i<l.length; i++)printf("%3d",l.elem[i]);getche();return 0;}




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。