`
xitong
  • 浏览: 6198147 次
文章分类
社区版块
存档分类
最新评论

线性表的学习

 
阅读更多

起因

记录一下自己线性表的学习过程,当年大学有老师讲的时候听的一塌糊涂,现在研究生二年级了,自己复习一下,总结一些对本科生可用的经验吧

线性表的单链表存储结构

//线性表的单链表存储结构(教科书恶心版)
typedef struct lnode
{
	int data;
	struct lnode *next;
}lnode, *linklist;

我没资格抨击教科书这种书写方式,但是我真的觉得很恶心,直到我现在才明白这种写法的真正意图,写一个自己改版的,认为更方便新手理解
//自己改写的单链表存储结构
struct lnode
{
	int data;
	struct lnode *next;
};
typedef struct lnode lnode;
typedef struct lnode *linklist;

单链表的存储方法

链表的结点结构如图:



链表的结点(Node)包括两个域:
  • 数据域 -- 存储数据元素信息的域
  • 指针域 -- 存储直接后继或者直接前继的域

n个结点以链接方式存储的线性表称为链表(linked list)

链表的具体存储表示为:
  1. 用一组任意的存储单元存放线性表的节点(这组存储单元既可以是连续的,也可以是不连续的)
  2. 链表中节点的逻辑顺序和物理顺序不一定一致。为了能够正确的表示节点间的逻辑顺序,因此增加了后继指针(指向后继节点的地址)

指针变量和结点变量




指针变量p和结点变量*p的关系

指针变量P 结点变量*P
定义 在变量说明部分显示定义 在指针变量P使用时,通过标准的mallc生成
取值 结点的地址 结点各个域的内容
操作方式 指针变量名访问 通过*取值运算符访问

生成结点变量的标准函数

p = (struct node *)malloc(sizeof(struct node *));

释放结点变量空间的标准函数

free(p);

结点域的访问

  1. (*p).data和(*p).next
  2. p->data和p->next

指针变量p和结点变量*p的关系

  • 指针变量p的值是结点的地址
  • 结点变量*p的值是结点的内容
  • *((*p).next)是*p后继结点的内容

头指针head和终端节点指针域的表示

单链表中每个节点的存储地址是存放在其前趋节点next域中,而开始节点无前趋,故设头指针head指向开始节点
终端节点无后继,故终端节点的next域为空
注意:
链表可由头指针唯一确定,单链表可由头指针的名字来命名

创建单链表

头插法创建单链表代码:
/**
 * Description:头插法创建单链表
 */
linklist createlisthead()
{
	int data;
	linklist head, s;
	head = NULL;

	while(scanf("%d",&data) != EOF)
	{
		s = (linklist)malloc(sizeof(lnode));
		s -> data = data;
		s -> next = head;
		head = s;
	}
	return head;
}

注意:该方法生成的链表顺序是与输入顺序相反的

头节点的作用:

头节点就是在链表开始之前附加一个节点,它具有两个优点:
  1. 由于开始节点的位置被存放在头节点的指针域中,所以在链表的第一个位置操作跟其它位置操作无差别
  2. 无论链表是否为空,其头指针都是指向头节点的非空指针

带头结点的尾插法建立单链表:
/**
 * Description:尾插法创建单链表
 */
linklist createlisttail()
{
	int data;
	linklist head, s, t;
	head = (linklist)malloc(sizeof(lnode));
	t = head;  //尾指针的初值指向头结点
	
	while(scanf("%d",&n) != EOF)
	{
		s = (linklist)malloc(sizeof(lnode));
	   	s -> data = data;
		t -> next = s;
		t = s;
	}
	t -> next = NULL;
	return head;
}

单链表的查找运算

(1)单链表不是随机存储结构

(2)查找代码(带头节点):

/**
 * Description:单链表中查找节点
 */
linklist getnode(linklist head, int i)
{
	int j;
	linklist p;

	for(p = head, j = 0; p -> next && j < i; ;)
	{
		p = p -> next;
		j ++;
	}

	if(i == j)
		return p;
	else
		return NULL;
}

单链表的插入操作

插入代码:
/**
 * Description:单链表的插入运算,在位置i之前插入节点
 */
void insertlist(linklist head, int i, int data)
{
	linklist p, s;
	p = getnode(head, i - 1);
	if(!p)
		exit("Error Position!\n");
	s = (linklist)malloc(sizeof(lnode));
	s -> data = data;
	s -> next = p -> next;
	p -> next = s;
}

单链表的删除操作

删除代码:
/**
 * Description:删除单链表head的第i个节点
 */
void deletelist(linklist head, int i)
{
	linklist p, s;
	p = getnode(head, i - 1);
	if(!p)
		exit("Error Position!\n");
	s = p -> next;
	p -> next = s -> next;
	free(s);
}

时间复杂度

以上操作的时间复杂度均为O(n)

分享到:
评论

相关推荐

    node-v8.15.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Java基础知识总结(超详细整理).txt

    Java基础知识总结(超详细整理)

    ISO IEC 27021-2017 信息技术.安全技术.信息安全管理系统专业人员的能力要求.pdf

    ISO IEC 27021-2017 信息技术.安全技术.信息安全管理系统专业人员的能力要求.pdf

    2024年中国DFB激光器芯片行业研究报告.docx

    2024年中国DFB激光器芯片行业研究报告

    公开整理-ESG视角下的多期DID构建数据集(2009-2022年).xlsx

    详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/138510939

    红帆OA(医疗版)漏洞细节未授权SQL注入请求注入数据包

    红帆OA(医疗版)是**一款专为医疗机构设计的办公自动化软件,旨在提高医院和相关卫生机构的工作效率和管理效能**。其功能特点包括: 1. **日常办公管理**:提供医院日常行政办公所需的基本功能,如文档处理、通知公告、会议管理等。 2. **科室管理**:支持医院内部各科室的管理需求,包括人员管理、资源分配、绩效考核等。 3. **信息集成**:能够整合医院内部的各类信息系统,实现数据共享和业务协同。 4. **多样化的医院类型支持**:适用于不同类型和规模的医院,如大学附属教学医院、综合性医院、专科医院、民营医院和集团医院等。 5. **业务范围广泛**:涵盖行政办公、医务室管理、科研管理、护士排班管理、党政管理和医患关系管理等多个方面。 6. **综合业务管理平台**:结合了卫生主管部门的管理规范和众多行业特色应用,是符合医院行业特点的综合业务管理平台。 7. **丰富的成功案例**:拥有众多成功案例,是医院综合业务管理软件中应用最广泛的之一。 需要注意的是,尽管红帆OA(医疗版)提供了强大的功能和广泛的应用场景,但任何软件系统都可能存在一定的安全风险,例如SQL注入漏洞等。因

    网页制作基础学习--HTML+CSS常用代码.txt

    网页制作基础学习--HTML+CSS常用代码

    ECHO HCS-2810ES_3810ES 操作手册

    HCS-2810ES_3810ES 说明书

    2024-2030中国3-吗啉丙磺酸市场现状研究分析与发展前景预测报告.docx

    2024-2030中国3-吗啉丙磺酸市场现状研究分析与发展前景预测报告

    node-v4.6.2-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.8.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    QYResearch:2023年前10大高流量治疗系统企业占据全球98%的市场份额.docx

    QYResearch:2023年前10大高流量治疗系统企业占据全球98%的市场份额.docx

    0.Python实现3D建模工具(上)内含设计文档和源码.md

    0.Python实现3D建模工具(上)内含设计文档和源码.md

    node-v8.8.1-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    c语言文件读写操作代码

    c语言文件读写操作代码

    node-v9.8.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    公开整理-ESG视角下的多期DID构建数据集(2009-2022年).dta

    详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/138510939

    MATLAB编程高效实战:涵盖核心数学、科学计算、数据可视化及算法应用,助力工程师与研究人员的必备函数代码集

    这款“matlab常用的函数代码”资源是您的最佳助手!它详细介绍了matlab中常用的函数代码,包括基本数学运算、数组创建和操作、控制流、数据导入和导出、绘图、数学函数以及字符串操作等。无论您是工程师、研究人员、学生还是matlab爱好者,这个资源都适合您。 资源以通俗易懂的语言,配合实例演示,帮助您更好地理解和掌握matlab编程的核心技巧。您可以在学习matlab的过程中,将其作为参考资料,随时查阅和巩固知识点。也可以在准备matlab项目或考试时,通过这个资源进行复习和提升。此外,这个资源还可以作为教学资料,辅助教学和学习。 这个资源的优势在于它的全面性和实用性。它不仅涵盖了matlab中的常用函数代码,还提供了一些实用的编程技巧和经验分享。通过学习这个资源,您将能够更加熟练地使用matlab,解决实际问题和项目挑战。 这款“matlab常用的函数代码”资源旨在帮助您快速掌握matlab编程的基本知识和技能,为您的学术和职业生涯提供坚实的支持。还等什么呢?快来学习这个资源,开启您的matlab编程之旅吧!

    node-v8.9.3-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    validate_before_handin.py

    validate_before_handin

Global site tag (gtag.js) - Google Analytics