数据结构链表操作

线性表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)

头结点一般不存储任何数据。

头指针:头指针是指链表指向的第一个结点的指针,如果链表有头结点则指向头结点。无论链表是否为空,头指针不为空。头指针为必要元素

头结点:头结点数据域没意义,一般用来放链表长度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdqTb0KG-1646470625274)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220305141911020.png)]

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;//最后一个为空

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值