大话数据结构:线性表链式存储(2)

单链表的删除

删除结点q,将它的前继结点的指针绕过,指向它的后继结点即可。

p->next=p->next->next,用p代替p->next

q=p->next;
p->next==q->next;

算法思路:
1.声明一指针p指向链表头指针,初始化j从1开始
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3.若到链表末尾p为空,则说明第i个结点不存在;
4.否则查找成功,将欲删除的结点p->next赋值给q;
5.单链表的删除标准语句p->next=q->next;
6.将q结点中的数据赋值给e,作为返回;
7.释放q结点;
8.返回成功。

实现代码算法如下

/*初始条件:顺序线性表L已存在,1<=i<=Listlength(L)*/
/*操作结果:删除L的第i个结点,并用e返回其值,L的长度减1*/
Status ListDelete(LinkList *L,int i,ElemType *e)
{
	int j;
	LinkList p,q;
	p=*L;
	j=1;
	while (p->next&&j<i)
	{
		p=p->next;
		++j;
 	}
	if(!(p->next)||j>i)
		return ERROR;
	q=p->next;
	p->next=q->next;
	*e=q->data;
	free(q);
	return OK;
}

free 标准函数 系统回收一个Node结点,释放内存,与malloc相对应

单链表插入/删除算法//显示链式存储的优势,时间复杂度总是O(1)

1.遍历查找第i个结点
2.插入和删除结点

单链表的整表创建

动态生成链表的过程,即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。
单链表整表创建的算法思路:
1.声明一指针p和计数器变量i;
2.初始化一空链表L;
3.让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
4.循环:
生成一个新结点赋值给p
随机生成一数字赋值给p的数据域p->data
将p插入到头结点与前一新结点之间

实现代码算法

头插法

/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/
void CreateListHead(LinkList *L/*链表名字是L*/,int n/*链表里有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(siizeof(Node));//生成新结点
		p->data=rand()%100+1;//数据域
		p->next=(*L)->next;
		(*L)->next=p;//插入到表头
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值