数据结构--单链表

一.单链表的设计

1.单链表的结构定义:

typedef struct Node{
int data;//数据域
struct Node* next;//后继指针
}Node,*List;

2.单链表的设计示意图:
3.注意:

单链表的最后一个节点的next域为NULL;

4.为什么要有一个头节点?

简单方便,不用传二级指针;

二.单链表的实现

cpp 复制代码
//初始化
}


//考试重点
//删除第一个val的值
bool DelVal(List plist, int val)
{
	Node* p = GetPrio(plist, val);
	if (p == NULL)
		return false;
	Node* q = p->next;
	//删除q
	p->next = q->next;//p->next=p->next->next;
	//释放q
	free(q);

	return true;
}

//返回key的前驱地址,如果不存在返回NULL;
Node* GetPrio(List plist, int key)
{
	for (Node* p = plist; p->next != NULL; p = p->next)
	{
		if (p->next->data == key)
			return p;
	}
	return NULL;
}

//返回key的后继地址,如果不存在返回NULL;
Node* GetNext(List plist, int key)
{
	assert(plist != NULL);
	if (plist == NULL)
		return NULL;

	Node* p = Search(plist, key);
	if (p == NULL)
		return NULL;

	return p->next;
}

//输出
void Show(List plist)
{
	//注意,头节点不能访问data
	for (Node* p = plist->next; p != NULL; p = p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
}

//清空数据
void Clear(List plist)
{
	Destroy(plist);
}

void Destroy(List plist)
{
	//总是删除第一个数据节点
	Node* p;
	while (plist->next != NULL)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);

		//error
		//plist->next = plist->next->next;
		//free(plist->next);
	}
}

三.单链表的总结

1.单链表的特点:

头插,头删 时间复杂度是O(1)

尾插,尾删 时间复杂度是O(n)

2.P初始化成什么?

如果我们要修改表的结构(或者说依赖于前驱,比如插入,删除):遍历:

cpp 复制代码
for(Node *p=plist;p->next!=NULL;p=p->next)

如果我们不修改表的结构(或者说不依赖于前驱, 比如求长度,打印,查找) :遍历:

cpp 复制代码
for (Node* p = plist->next; p != NULL; p = p->next)
3.注意考点:

头插,尾插,按值删除;

相关推荐
Savior`L4 小时前
二分算法及常见用法
数据结构·c++·算法
甄心爱学习6 小时前
CSP认证 备考(python)
数据结构·python·算法·动态规划
kyle~7 小时前
排序---常用排序算法汇总
数据结构·算法·排序算法
有时间要学习7 小时前
面试150——第二周
数据结构·算法·leetcode
freedom_1024_8 小时前
红黑树底层原理拆解
开发语言·数据结构·b树
liu****8 小时前
3.链表讲解
c语言·开发语言·数据结构·算法·链表
minji...8 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
CQ_YM9 小时前
数据结构之栈
数据结构·算法·
xlq223229 小时前
24.map set(下)
数据结构·c++·算法
立志成为大牛的小牛10 小时前
数据结构——五十四、处理冲突的方法——开放定址法(王道408)
数据结构·学习·程序人生·考研·算法