【数据结构学习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<stdio.h>
#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);
}
低级错误:超级低级错误,TOT
在指针赋值的时候,用*p=&xxxxxx;蓝瘦.......
其实通过看书可以将定义指针与赋予地址一同写。如 int *p=&xxxxxx;

0 0
原创粉丝点击