线性表3.5
1.顺序存储结构线性表
1.1删除操作
Status ListDelete(SqList *L,int i,ElemType *e)
{
if(L->length==0)//判断是否为空表
{
return error;
}
if(i>L-length||i<1)//判断删除的位置是否在表内
{
return error;
}
*e=L->data[i-1];//将删除位置的数据给e
if(i<L->length)
{
for(k=i;k<L->length;k++)
{
L->data[k-1]=L->data[k]//i位置后面的元素依次往前移一位
}
}
L->length--;//表长减一
return OK;
}
O(n)
读取线性表时,复杂度为O(1),插入和删除为O(n)
2.链式存储结构线性表
2.1链式存储结构
优点:1.无须为元素之间的逻辑关系增加额外的存储空间
2.快速存储任意位置元素
缺点:1.插入与删除需要移动大量元素
2.线性表长度变化大,难以确定存储空间容量
3.容易造成碎片
定义:
用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用任意位置。
数据称为数据域,存放指针的称为指针域,两个部分组成叫做接点。
顺序线性表只需一个位置来存放,链式线性表需要两个位置,一个存放数据,一个存放指向下一个元素的指针
链表中第一个结点称为头指针,最后一个结点指针为空(NULL)
头结点一般不存储任何数据。
头指针:头指针是指链表指向的第一个结点的指针,如果链表有头结点则指向头结点。无论链表是否为空,头指针不为空。头指针为必要元素
头结点:头结点数据域没意义,一般用来放链表长度
p是指向第i个元素的指针,那么p->data=ai,p->next->data=ai+1
2.2链表的查找
Status GetElem(LinkList L,int i,ELemType *e)
{
int j;
LinkList p;
p=L->next;//p为第一个数据
j=1;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
{
return error;
}
*e=p->data;
return OK;
}
O(n)
2.3链表的插入
Status GetElem(LinkList L,int i,ELemType *e)
{
int j;
LinkList p,s;
p=L->next;
j=1;
while(p && j<i)//用来找第i个结点
{
p=p->next;
j++;
}
if(!p||j>i)
{
return error;
}
s=(LinkList)malloc(sizeof(Node));//malloc生成一个新结点
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
2.4链表的删除
Status GetElem(LinkList L,int i,ELemType *e)
{
int j;
LinkList p,q;
p=L->next;//p为第一个数据
j=1;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
{
return error;
}
q=p->next;//使q指向p的下一个结点
p->next=q->next;//清空p的指针域
*e=p->data;//将p的数据保存
free(q);
return OK;
}
3.单链表的创建
3.1头插法创建单链表
Void CreateListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;//首先将头结点的next给新结点
(*L)->next=p;//然后把头指针的next指向p
}
}
3.2尾插法创建单链表
Void CreateListHead(LinkList *L,int n)
{
LinkList p,r;
int i;
r=*L;//让r指向头结点
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;//插入新节点后,r指向新节点
r=p;
}
r->next=NULL;//最后一个为空
}