数据结构链表一

数据结构之单链表链表建立

一、引入文件

#include <stdio.h>
#include <malloc.h>

二、定义结构体

struct ListNode {
	int val;
	struct ListNode* next;
};

结构体成员变量包括两部分,一是数据域val,二是指针域后继节点指针next

三、单链表实现原理

1.链表的存储结构

①节点存储地址是任意的,相邻元素的物理地址不一定相邻
②只能通过头指针进入链表,通过指针域依次向后顺序扫描链表(顺序存取)

2.单链表的特点

单链表由表头唯一确定,可以用头指针命名单链表(如头指针L,则称链表为L)

3.带头结点的单链表在这里插入图片描述

头结点指针域为空,或表示为head->next=NULL,即链表为空表
带头节点的好处
①便于对首元结点处理,因为首元节点的地址保存在头结点的指针域中,保证链表的第一位置操作和后面的节点一样
②便于非空表与空表的处理,因为头指针都是指向头结点的非空指针

4.不带头节点的单链表

head->next=NULL,即链表为空表

四、头插法建立单链表

在这里插入图片描述

void CreateList(struct ListNode* L, int* a, int n)
{
	
	struct ListNode* s;
	s = L->next;
	//头插法
	for (int i = 0; i < n; i++) {
		s = (struct ListNode*)malloc(sizeof(struct ListNode));
		s->val = a[i];
		//进入下一节点
		s->next = L->next;
		L->next = s;
	}
}

五、尾插法建立单链表

在这里插入图片描述

oid CreateList(struct ListNode* L, int* a, int n)
{
	struct ListNode* L h;
    h=L;//拷贝头指针

	struct ListNode* s;
	s = L->next;
	//尾插法
	for (int i = 0; i < n; i++) {
		s = (struct ListNode*)malloc(sizeof(struct ListNode));
        //尾插入节点
        s->val=a[i]
        s->next=h->next;
        h->next=s;
        //进入下一节点
        h=s;
        s=s->next;
    }
}

六、执行结果

void printList(struct ListNode* L) {
	struct ListNode* p;
	p = L->next;//首元位置
	while (p!= NULL) {
		printf("%d ", p->val);
		p = p->next;
	}
}

void main()
{

	struct ListNode* l1, * l2;
	l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	l1->next = NULL;

	l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	l2->next = NULL;

	int a[5] = {1,2,3,4,5 };

	CreateList_head(l1, a, 5);
	CreateList_tail(l2, a, 5);
    printf("头插法:");
	printList(l1);
	printf("\n");
	printf("尾插法:");
	printList(l2);

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
链表是一种常见的数据结构,用于存储和组织数据。它由节点组成,每个节点包含一个值和一个指向下一个节点的指针。链表中的节点可以按顺序链接,形成一个链式结构。 链表有多种类型,包括单链表、双链表和循环链表。单链表中每个节点只有一个指向下一个节点的指针;双链表中每个节点有两个指针,分别指向前一个节点和后一个节点;循环链表中最后一个节点的指针指向第一个节点,形成一个循环。 链表的优点是插入和删除操作的时间复杂度为O(1),因为只需要修改节点的指针即可。而数组在插入和删除时需要移动其他元素,时间复杂度为O(n)。链表的缺点是访问某个节点的时间复杂度为O(n),因为需要从头节点开始遍历。 链表在许多应用中都有广泛的应用。一些常见的应用包括: 1. 实现栈和队列:链表可以用来实现栈和队列这样的数据结构,其中栈是一种后进先出(LIFO)的结构,队列是一种先进先出(FIFO)的结构。 2. 内存分配:动态内存分配时,链表可以用来管理空闲内存块,以便高效地分配和释放内存。 3. 图的表示:链表可以用来表示图的邻接表,其中每个顶点都用一个链表来存储与其相邻的顶点。 4. 多项式求解:链表可以用来表示多项式,并进行多项式加法、乘法等运算。 5. 缓存实现:链表可以用来实现缓存,其中最近使用的数据节点被放在链表的头部,最久未使用的数据节点被放在链表的尾部。 这些只是链表应用的一些例子,实际上链表在计算机科学和软件工程中有许多其他的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有几何

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

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

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

打赏作者

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

抵扣说明:

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

余额充值