您的位置:首页 > 理论基础 > 数据结构算法

数据结构_线性表_顺序表 的创建,插入,删除,查找

2016-05-04 21:13 393 查看
数据结构的分类,按照元素之间的对应关系可以分为四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。

树形结构和图形结构全称为非线性结构。

集合结构中的数据元素除了同属于一种类型外,别无其它关系。

线性结构中元素之间存在一对一关系.

树形结构中元素之间存在一对多关系.

图形结构中元素之间存在多对多关系。在图形结构中每个结点的前驱结点数和后续结点数可以任意多个

数据结构按照存储结构分类:

数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。

1>顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。

2>链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。

3>索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

4>散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。

(首先要了解顺序结构,顺序机构就是将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。

其次要了解线性表的线性

线性表是最基本、最简单、也是最常用的一种数据结构。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。

我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。)

采用顺序存储结构的线性表简称为“ 顺序表”。

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

线性表采用顺序存储的方式存储就称之为顺序表。

顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n 其中,L是元素占用存储单元的长度。



1.线性表的定义

#pragma 顺序表的定义
#define MaxSize 100

typedef int elemtype;
typedef struct {
elemtype v[MaxSize];
int len;

}sqlist


2.顺序表的创建

sqlist*L;
L=(sqlist*)malloc(sizeof(sqlist));
L->len=10;


3.顺序表的插入

int insert(sqlist*L,int i,elemtype x) {

int j=0;
if (L->len>=MaxSize) {
printf("移除\n");
return 0;
}else if (i<1||i>L->len+1) {

printf("插入位置不正确\n");
return 0;

} else {
for (j=L->len-1; j>=i-1; j--)

L->v[j+1]=L->v[j];
L->v[i-1]=x;
L->len=L->len+1;
return 1;
}
}


4.顺序表求长度

int lenth(sqlist*L) {

int length;
length=L->len;
return length;
}


5顺序表的遍历

void printV(sqlist*L) {

for (int i=0; i<L->len; i++) {
printf("v的每个元素为:%d\n",L->v[i]);
}

}


6.顺序表的删除

int delet(sqlist*L,int i,elemtype *y) {

if (lenth(L)==0) {
printf("空表不能删除");
return 0;
}
int j;
L->v[3]=*y;
if (i<1||i>L->len) {
printf("删除位置不正确!越界删除");
return 0;
}else {

for (j=i; j<L->len; j++)
L->v[j-1]=L->v[j];
L->len=L->len-1;
return 1;
}

}


7.顺序表的查找

int searchX(sqlist*L,int x) {

if (L==NULL||L->len==0) {
return 0;
}
int i;

for (i=0; i<L->len; i++) {
if (x==L->v[i]) {
printf("找到了是%d个元素\n",i+1);

return 1;
break;
}

}
return 0;

}


8调用

int main(int argc, const char * argv[]) {
// insert code here...

sqlist*L;
//int lenth(sqlist*L);
L=(sqlist*)malloc(sizeof(sqlist));
L->len=10;
printf("顺序表的长度:%d\n",lenth(L));
printV(L);
int sucess= insert(L, 5, 88);

if (sucess) {
printf("插入成功\n");
}else {
printf("插入失败\n");
}
printV(L);
printf("顺序表的长度:%d\n",lenth(L));

int a=1234;
int*p=&a;

int dele=  delet(L, 7,p );

if (dele) {
printf("删除成功\n");
}else {
printf("删除失败\n");
}

printV(L);
printf("顺序表的长度:%d\n",lenth(L));

int search=searchX(L, 1234);

return 0;
}


9运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: