【数据结构学习2】线性表,顺序表定义中详细表述。
来源:互联网 发布:怎样看出淘宝是包邮的 编辑:程序博客网 时间:2024/06/03 19:11
【这个博客东西大部分是别人的东西,我只是学习记录并做一个整理,如果博客中有侵犯您的著作权,请告知删除,谢谢】
1.线性表的抽象数据类型。
操作步骤:创建,初始化,置为空表,还有获取表长,插入数据,删除数据等。
2.顺序表的存储。
(1)结构代码:
#define MAXSIZE 20 存储空间初始分配量,也就是数组的大小。
typedef int ElemType;
typedef struct {
ElemType data [MAXSIZE]; /*定义了数组*/
int length; 线性表当前的长度。
}SqList;
地址计算方法:LOC(ai+1)=LOC(ai)+c LOC(ai)=LOC(a1)+(n-1)c
(2)获取元素操作。可以用L.elem[i]来获取。
(3)插入操作
思路:1.判断插入位置是否合理。2.线性表长度若超出,则要抛出异常。3.从最后一个元素开始后移。4.插入.5.表长加1。
(此处与我所用的严姥姥版有落差,尚未明白。)
严版线性表的定义。
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量,这个是超出是分配的量
typedef struct{
ElemType *elem; //*存储空间的基地址,也就是从这里开始存储。*//
int length; //*当前存储的长度,元素个数*//
int listsize; //*、容量*//
}Sqlist;
疑问:为什么用指针?上诉用数组来容纳数据,那么这个动态分配的本质是什么?
(经过百度,得知上述两种分别为动态与静态的顺序表)
代码个人分析:elem:element 元素简写。LIST_INIT_SIZE 是初始分配的储存空间, LISTINCREMENT是当空间不足时,会增加的空间。
接下来为初始化操作:
Status InitList Sq(SqList &L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.lenth=0;
L.listsize= LIST_INIT_SIZE; //此变量的单位为sizeof(ElemType)此处为分派到总共单位个sizeof(ElemType)
return OK;
}
初始化中:
须学习malloc的用法:L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
将数值代入解释为:开辟了(LIST_INIT_SIZE)100个类型为ElemType元素大小的空间。
(ElemType*)是将malloc返回的内存空间地址转成(ElemType *)类型的,再赋给L.elem(为指针)。
另外:为什么用!L.elem作为判断条件!
#include<malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ERROR 0
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
void InitList_Sq(Sqlist &L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(ERROR);
L.listsize=LIST_INIT_SIZE;
L.length=0; //*此处注意length不存在,应该引用结构体中的L.length*//
}
void Insert_Sq(Sqlist &L,int i,ElemType e){
if(i<1||i>L.length+1)
printf("the position is error");
int *p,*q;
q=&L.elem[i-1]; //*此处注意[]为i-1,因为从0开始*//
for(p=&L.elem[L.length-1];p>=q;--p)
*(p+1)=*p; //*巧妙的用(p+1)能够不改变p的地址,也能够直接赋值*//
*q=e;
++L.length;
}
void Delete_Sq(Sqlist &L,int i,ElemType &e){
if(i<1||i>L.length+1)
printf("the position is error");
int *q,*p;
q=&L.elem[i-1];
e=*q;
p=&L.elem[L.length] ;
for(;q<p;q++)
*q=*(q+1);
L.length--;
}
void display(Sqlist L){
int i;
for(i=0;i<L.length;i++)
printf("%4d ",L.elem[i]); //*右对齐,用空格补齐*//
printf("\n");
}
int main(){
Sqlist L;
int i,e,n,m,k; //*不需要定义length等*//
InitList_Sq(L); //*由于用了void所以不需要L= 来接受返回,因为没有返回.另外还犯错了,用了&L,因为函数中已经用了引用,此处不需要用直接L就可以*//
printf("请输入表长:");
scanf("%d",&L.length);//*直接用L里的length接受省去了定义参数*//
printf("请输入各个元素:");
for(i=0;i<L.length;i++){
scanf("%d",&L.elem[i]);
}
display(L);
printf("请输入插入的位置:");
scanf("%d",&n);
printf("请输入插入的元素:");
scanf("%d",&e);
Insert_Sq(L,n,e);
display(L);
printf("请输入删除元素的位置:");
scanf("%d",&m);
Delete_Sq(L,m,k);
printf("当前的表:");
display(L);
}
- 【数据结构学习2】线性表,顺序表定义中详细表述。
- 数据结构--线性表(数组表述)
- 数据结构和算法 C/C++ Java 和 C# 版 - (2)线性表 精准表述 实现
- 数据结构--顺序线性表
- 数据结构--顺序线性表
- 线性数据结构--顺序表
- 数据结构-线性顺序表
- 数据结构之线性表2顺序表
- 数据结构-线性表-顺序表
- 数据结构-线性表-顺序表
- 数据结构 线性表 顺序表
- 数据结构-线性表-顺序表
- 【数据结构-线性表】顺序表
- 数据结构-线性表-顺序表
- 数据结构实现顺序线性表
- 数据结构--线性表顺序存储
- 数据结构线性表顺序建链表
- 数据结构--线性表顺序实现
- Java编程实现数组排序——(一)插入排序
- [PPC]不關機退出LAND AIR SEA WARFARE
- ubuntu14.04 64位caffe配置遇到libboost依赖问题
- TP-LINK无线路由器WDS功能应用提升家中WIFI速度
- 业余04—VC++6.0Error spawning cl.exe路径错误解决办法
- 【数据结构学习2】线性表,顺序表定义中详细表述。
- c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?
- 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案
- Scala语言扫盲第四篇:类与对象
- JavaScript函数绑定
- Redis数据类型之String类型
- 二分查找
- Cocos2d-过渡篇(三) 触摸机制
- 爬取糗事百科文字段子,(2016年10月22日可用)