数据结构与算法学习笔记02_3(线性表)

数据结构与算法学习笔记02_3(线性表)

 

单链表的整表创建

单链表整表创建的算法思路如下:

创建单链表的过程是一个动态生成链表的过程,从“空表”的初始状态起,依次建立各元素结点并逐个插入链表。

所以单链表整表创建的算法思路如下:

声明一结点p和计数器变量i;

初始化一空链表L;

让L的头结点的指针指向NULL,即建立一个带头结点的单链表;

循环实现后继结点的赋值和插入。

 

头插法建立单链表

头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。

简单来说,就是把新加进的元素放在表头后的第一个位置:

先让新节点的next指向头节点之后

然后让表头的next指向新节点

 

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;
		(*L)->next = p;
	}
}
 

尾插法建立单链表

void createListTail(LinkList *L, int n){
	LinkList p ,r;
	int i;

	srand(time(0));//初始化随机种子
	*L = (LinkList)malloc(sizeof(Node));
	r = *L;

	for (i = 0; i < n;i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand() % 100 + 1;
		r->next = p;
		r = p;
	}
	r->next = NULL;
}

单链表的整表删除

单链表整表删除的算法思路如下:

声明结点p和q;

将第一个结点赋值给p,下一结点赋值给q;

循环执行释放p和将q赋值给p的操作;

Status ClearList(LinkList *L){
	LinkList p, q;
	p = (*L)->next;

	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
	return Ok;
}

结论:

若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。

若需要频繁插入和删除时,宜采用单链表结构。

比如说游戏开发中,对于用户注册的个人信息,除了注册时插入数据外,绝大多数情况都是读取,所以应该考虑用顺序存储结构。

而游戏中的玩家的武器或者装备列表,随着玩家的游戏过程中,可能会随时增加或删除,此时再用顺序存储就不太合适了,单链表结构就可以大展拳脚了。

当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。

而如果事先知道线性表的大致长度,比如一年12个月,一周就是星期一至星期日共七天,这种用顺序存储结构效率会高很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值