数据结构基础
第一章 线性表
文章目录
前言
作为刚步入大学的计算机学生,打算记录自己的学习的同时总结知识点,如出现错误请包涵,也希望能与你一起进步!!
一、线性表的定义
1.定义与性质
·线性表是零个或多个数据元素(自定义元素也可)构成的线性序列,记为(a0,a1,…an)。
·线性表中的数据元素个数n称为线性表的长度,当n=0时,线性表为空表。
·线性表(a0,a1,…ai-1,ai,ai+1,…an),其中ai-1是ai的直接前驱,ai+1是ai的直接后驱。特别的:a0没有直接前驱,an没有直接后驱。
·线性表示例:
1,字母表(a,b,c,d…);
2,学生信息表(这属于自定义数据类型)
2.线性表的抽象数据类型
也就是代码实现
ADT List{
数据:
零个或多个数据元素构成的线性序列(即创建一个数组或链表,可以是普通类型,也可以自己定义)。
运算:
·Lnit(L,n):构造一个空的线性表L。
·Destory(L):销毁。
·IsFull():判断表是否已满
·IsEmpty(L):判断表是否为空。
·Length(L):获取表的长度。
·Find(L,i):获取ai位置的元素。
·Insert(L,x,i):在表的x位置插入元素i。
·Delete(L,i):删除元素ai,后面的元素前移。
·Update(L,i,x):将ai位置的元素更新为x。
·Output(L):输出线性表所有元素。
}
二、线性表的顺序实现
顺序实现即使用数组
1.定义
·利用连续的储存空间,按照数据元素在线性表中的序号依次存储数据元素。
·采用顺序储存的线性表称为顺序表。
·实现时采用一维数组秒速线性表的存储结构
代码部分
typedef struct list
{
ElemType *arr; //这里的ElemType 是数据类型。
int cur; //数组的当前元素个数。
int length; //数组长度。
}List;
2.运算实现
这个部分我就只列两个主要的部分;
·插入运算
bool Insert(List *L,int i,ElemType x)
{
if(IsFull(L))
return false;
for(int j=L.cur;j>i;j--)
L->arr[j+1]=L->arr[j];
L->arr[i]=x;
return true;
}
·删除运算
bool Delete(List *L,int i)
{
if(Isfull(L))
return false;
for(int j=i;j<L->n;j++)
L->arr[j]=L->arr[j+1];
return true;
}
三、线性表的链接实现
链接实现即使用链表,链表又分为单链表、双向链表、循环链表等,这里我们通过单链表进行实现。
1.定义
typedef struct node
{
Elemtype element;
Node *next
}Node;
typedef struct list
{
Node *head;
int length;
}List;
2.运算
包括元素的插入以及元素的删除
1 bool Insert(List *L,int i,int x)//插入运算
{
if(i<0||i>L->lenth)//当插入位置不符合时返回;
return false;
Node *p=L->head;
for(int j=0;j<i;j++)
p=p->head;
Node *q=p;
q->next=p->next;
p->next=q;
q->element=x;
L->lenth+=1;
return true;
}
2 bool ListDle(List *L,int i)//删除运算
{
if(i<=0||i>:->lenth)
return false;
Node *p=L->head;
for(int j=0;j<i-1;j++)
p=p->next;
Node *q=p->next;
p->next=q->next;
free(q);
L->lenth-=1;
return true;
}
四、顺序实现与链接实现对比
1.顺序实现
优点:
(1) 可随机访问
(2) 存储空间利用率高
缺点:
(1) 插入、删除效率较低
(2)元素存储空间需提前分配,难以临时扩大
2.链接实现
优点:
(1)插入删除元素效率较高
(2)无最大元素存储个数,可随时扩大
缺点:
(1)存储空间利用率较低
(2访问元素效率较低
链接实现:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了线性表的顺序实现与链接实现,而线性表的实际应用还需大家自己发掘咯!!