数据结构——线性表的链式存储结构1(单链表)

目录

前言

链表的定义

单链表的构建

单链表数据的插入

单链表数据的删除

单链表的数据的查询

单链表的数据修改

单链表的建立(头插法)

单链表的建立(尾插法)

单链表整表的删除(空间释放)

单链表结构与顺序存储结构的优缺点


前言

为了解决顺序存储不足:用线性表另外一种结构-链式存储。在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素都有一个明确的指针指向线性表的下一个元素的位置(即地址)。

链表的定义

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。在顺序结构中,每个数据元素只需要存数据元素信息就行了,而在链式结构中,除了存储数据元素信息外,还要存储它的后继元素的存储地址。所以一般结点包括两个信息:数据和指针。链表就是n个节点组成的,如果每个结点只包含一个指针,那么就是单链表。

有头有尾:我们把链表中第一个结点的存储位置叫作头指针,那么整个链表的存取就必须是从头指针开始进行的。而线性链表的最后一个结点指针为空(NULL)。从图中可以看到,结点都是由两部分组成,数据域和指针域。


 结点是由存放数据元素的数据域和存放后继结点地址的指针域组成

单链表的构建

typedef int ElenTypedf;
typedef struct Node
{
	ElenTypedf data;//存储数据
	struct Node* next;
}Node;
typedef struct Node* LinkList;

单链表数据的插入

//单链表的插入
void ListInert(LinkList* ps, int i,ElenTypedf e)
{
	int j;
	LinkList p,s; //声明一个节点p
	p = *ps;
	j = 1;//计数器
	assert(!p&&j>i);//第i个元素不存在
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	s = (LinkList)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;
	p->next = s;
}

单链表数据的删除

//单链表的删除
void ListDelete(LinkList* ps, int i)
{
	int j;
	LinkList p;
	p = *ps;
	j = 1;
	while (p->next && j < i)
	{
		p = p->next;
		j++;
	}
	assert(!(p->next) && j > i);
	p->next = p->next->next;
}

单链表的数据的查询

//单链表的数据查询
ElenTypedf ListSearch(LinkList ps,int i,ElenTypedf*e)
{
	int j = 0;
	LinkList p;//声明一个节点p
	p = ps->next;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	assert(!p && j > i);
	*e = p->data;
}

单链表的数据修改

//单链表的数据修改
void ListModify(LinkList* ps, int i, ElenTypedf e)
{
	int j = 0;
	LinkList p;
	p = *ps;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	assert(!p && j > i);
	p->data = e;
}

单链表的建立(头插法)

//单链表的建立(头插法)
void LinkListpushfront(LinkList* ps, int n)
{
	LinkList p;
	int i = 0;
	srand(time(0));
	*ps = (LinkList)malloc(sizeof(Node));
	(*ps)->next = NULL;//先建立一个头节点
	for (i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand() % 100 + 1;
		p->next = (*ps)->next;
		(*ps)->next = p;
	}

}

单链表的建立(尾插法)

//单链表的建立(尾插法)
void LinkListPushBack(LinkList* L, int n)
{
	LinkList p, r;
	int i = 0;
	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;
}

单链表整表的删除(空间释放)

//单链表整表的删除
void ClearList(LinkList* L)
{
	LinkList p, q;
	p = (*L)->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
}
int main()
{
	LinkList p=NULL;
	LinkListPushBack(&p,10);
	return 0;
}

单链表结构与顺序存储结构的优缺点

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

当线性表中的元素个数变化较大或者根本不知道多大时最好用单链表结构。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binary~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值