第二章线性表

线性表

定义

  • n个相同数据类型的有序序列
  • 第一个元素会表头元素
  • 最后一个元素会表尾元素
  • 其他元素都有一个直接前驱和直接后继

顺序表

  • 线性表的顺序存储就是顺序表
  • 第n个元素存储地址:loc(a1)+(n-1)*元素大小

1. 静态实现

https://blog.csdn.net/m0_60716245/article/details/131799305

2. 动态实现

https://blog.csdn.net/m0_60716245/article/details/131799331

单链表表

  • 线性表的链式存储

1. 有头节点的实现

https://blog.csdn.net/m0_60716245/article/details/131799254

循环链表

  • 单链表的尾节点指向null,循环链表的尾节点指向头节点
  • 单链表从任意节点无法查找之前的节点,循环链表从表中任意节点出发无法找到任意节点

1. 循环链表常用操作

// 单链表,终止条件
p!=NULL;
p->next!=NULL;

p->next==NULL;	// 单链表空表判断

// 循环链表,终止条件
p!=L;
p->next!=L;

p->next==L;	// 单链表空表判断

2. 带尾指针的循环链表合并

  • p存储表一头节点
  • 表一尾节点连接表二表头,释放表二表头
  • 表二尾节点指向表一头节点

void connect(LinkList &A,LinkList &B){
	if(A->next==A||B->next==B){
		printf(" error \n");
		return;
	}

	Node *p=A->next;
	A->next=B->next->next;
	free(B->next);
	B->next=p;
	printf(" success \n");
}

双链表

  • 单链表寻找某个节点的前驱节点必须从表头出发时间复杂度O(n)
  • 双链表在单链表的基础上增加了一个指向前驱节点的指针域

1.有头双向链表的实现

https://blog.csdn.net/m0_60716245/article/details/131843211

链表和顺序表的比较

  • 链式存储的优点:节点空间可以动态申请和释放,插入删除不需要大量移动元素
  • 链式存储的缺点:指针域需要额外占用空间,存储密度小(节点数据空间/节点空间)。非随机存取任何一个节点操作都要从头查找到该节点

1. 空间上

  • 顺序表内存需要预先分配会导致空闲内存或者溢出,链表不会
  • 顺序表存储密度为1,链表小于1需要额外的空间存储指针域

2. 时间上

  • 顺序表查找元素O(1),链表是O(n)
  • 顺序表插入和删除元素O(n),链表是O(1)
  • 顺序表适合预先知道空间,经常查找元素
  • 链表适合不确定空间,经常插入和删除元素

线性表的应用

https://blog.csdn.net/m0_60716245/article/details/131875233

你可能感兴趣的:(数据结构与算法,数据结构,算法,链表)