线性表-链式存储结构

线性表-链式存储结构

链式存储结构

组成部分

  • 头指针:指向链表头的指针
  • 尾指针:指向链表尾的指针
  • 节点:存放元素值和指向下一个节点的指针组成

注:本次作者所讲是单链表
头指针指向链表的第一个节点,尾指针指向链表的最后一个节点。(当链表只有一个节点时,头指针和尾指针都指向那个唯一的节点)

链表创建,获得元素,插入,删除操作

//C++代码

例:链表创建

typedef struct _Node
{
	int data;//节点的数值
	struct  _Node *next;//指针指向下一个节点
}Node;
int main()
{
	Node *pHead = NULL;//头指针
	Node *pEnd = NULL;//尾指针

	int i = 1;
	while (i <= 5)//添加5个元素
	{
		Node *node = new Node;
		node->data = i;
		node->next = NULL;
		//新元素在链表头添加
		if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
		{
			pHead = node;
			pEnd = node;
		}
		else
		{
			node->next = pHead;//新的节点next指向源节点
			pHead = node;//头指针指向新的节点
		}
		i++;
	}
}
//结果: 5 4 3 2 1

例:获得元素值

typedef struct _Node
{
	int data;//节点的数值
	struct  _Node *next;//指针指向下一个节点
}Node;
int main()
{
	Node *pHead = NULL;//头指针
	Node *pEnd = NULL;//尾指针

	int i = 1;
	while (i <= 5)//添加5个元素
	{
		Node *node = new Node;
		node->data = i;
		node->next = NULL;
		//新元素在链表头添加
		if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
		{
			pHead = node;
			pEnd = node;
		}
		else
		{
			node->next = pHead;//新的节点next指向源节点
			pHead = node;//头指针指向新的节点
		}
		i++;
	}
	
	Node *p = pHead;//临时节点
	//得到下标为3的节点
	int index = 3;
	i = 0;
	while (i < index)//循环找到下标为3的节点
	{
		p = p->next;
		i++;
	}
	cout << p->data << endl;
}
//结果:2

例:插入数据

typedef struct _Node
{
	int data;//节点的数值
	struct  _Node *next;//指针指向下一个节点
}Node;
int main()
{
	Node *pHead = NULL;//头指针
	Node *pEnd = NULL;//尾指针
	int i = 1;
	while (i <= 5)//添加5个元素
	{
		Node *node = new Node;
		node->data = i;
		node->next = NULL;
		//新元素在链表头添加
		if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
		{
			pHead = node;
			pEnd = node;
		}
		else
		{
			node->next = pHead;//新的节点next指向源节点
			pHead = node;//头指针指向新的节点
		}
		i++;
	}
	Node *p = pHead;
	//插入的节点
	Node *pNewNode = new Node;
	pNewNode->data = 10;//插入节点的数值
	pNewNode->next = NULL;//插入节点的next
	//插入下标为3
	int index = 3;
	for (int i = 0; i < 3 - 1; i++)//找到要插入下标的前一个节点
	{
		p = p->next;
	}
	pNewNode->next = p->next;//p节点的next指针赋值给新的节点next指针
	p->next = pNewNode;//p节点的next指针指向新的节点
	//遍历链表
	Node *temp = pHead;
	while (temp != NULL)
	{
		cout << temp->data << endl;
		temp = temp->next;
	}
}
//结果:5 4 3 10 2 1

例:删除数据

typedef struct _Node
{
	int data;//节点的数值
	struct  _Node *next;//指针指向下一个节点
}Node;
int main()
{
	Node *pHead = NULL;//头指针
	Node *pEnd = NULL;//尾指针

	int i = 1;
	while (i <= 5)//添加5个元素
	{
		Node *node = new Node;
		node->data = i;
		node->next = NULL;
		//新元素在链表头添加
		if (pHead == NULL || pEnd == NULL)//首次添加头尾指针都指向一个节点
		{
			pHead = node;
			pEnd = node;
		}
		else
		{
			node->next = pHead;//新的节点next指向源节点
			pHead = node;//头指针指向新的节点
		}
		i++;
	}
	Node *p = pHead;
	//删除下标为2
	int index = 2;
	for (int i = 0; i < index - 1; i++)//找到要插入下标的前一个位置
	{
		p = p->next;
	}
	Node *NodeDel = p->next;//记录要删除的节点指针
	p->next = NodeDel->next;
	delete NodeDel;//释放目标节点指针
	//遍历链表
	Node *temp = pHead;
	while (temp != NULL)
	{
		cout << temp->data << endl;
		temp = temp->next;
	}
}
//结果:5 4 2 1

复杂度

在存、读数据时,时间复杂度是:O(n);
插入、删除时,时间复杂度是:O(1);

优缺点

优点

  • 插入删除速度比顺序存储结构快

缺点

  • 查找速度慢于顺序储存结构

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/83478050