(3)链表

目录

下面是关于链表的一些知识点:

链表的操作:

创建链表

遍历链表

判断链表是否为空

求链表长度

插入元素

删除元素

排序链表


 


这篇笔记是根据郝斌老师的上课讲义整理而得:

前面介绍了连续的存储结构:数组,今天来介绍链表,是用来进行离散的存储。首先我们来介绍typedef 的使用:

typedef struct Student
{int sid;char[20] name;int age;}* pST,ST;ST st;
PST ps = &st;
ps->sid =99;

下面是关于链表的一些知识点:

链表的定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,只有一个后续节点, 首节点没有前驱节点,尾节点没有后续节点。

首节点:第一个存放有效数据的节点。

尾节点:最后一个存放有效数据的节点。

头结点:没有存放数据或者链表大小的一个节点,首节点前面的一个节点。其数据类型和首节点一样。主要为了方便对链表的操作。

头指针:指向头节点的指针变量。

尾指针:指向尾节点的指针变量。

数组和链表的比较

数组连续,操作方便,获取非常快,长度固定。

链表离散,内存利用率小些(存放额外的指针),插入非常快,查找困难一些。长度不定,动态添加容易。

确定一个链表需要的几个参数

头指针,有了头指针我们就可以推算出其他所有的信息。

一个链表的节点定义为:

typedefine struct Node
{int data;//数据域,可以是非常复杂的数据结构struct Node * pNext;//指针域
}*PNODE,NODE;

链表的分类

单链表:单向的链表,指针域只指向后面或者前面

双链表:每一个节点有两个指针域,分别指向前节点和后节点

循环链表:能通过任何一个节点找到其他所有的节点

非循环链表:不是循环的链表都是非循环链表

链表的操作:

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>typedef struct Node
{int data; //数据域struct Node * pNext; //指针域
}NODE, *PNODE; //NODE等价于struct Node    PNODE等价于struct Node *</st//函数声明
PNODE create_list(void);  //创建链表
void traverse_list(PNODE pHead);  //遍历链表
bool is_empty(PNODE pHead);  //判断链表是否为空
int length_list(PNODE);  //求链表长度
bool insert_list(PNODE pHead, int pos, int val);  //在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
bool delete_list(PNODE pHead, int pos, int * pVal);  //删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中,  并且pos的值是从1开始
void sort_list(PNODE);  //对链表进行排序

创建链表

PNODE create_list(void)
{int len;  //用来存放有效节点的个数int i;int val; //用来临时存放用户输入的结点的值//分配了一个不存放有效数据的头结点PNODE pHead = (PNODE)malloc(sizeof(NODE));if (NULL == pHead){printf("分配失败, 程序终止!\n");exit(-1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入您需要生成的链表节点的个数: len = ");scanf("%d", &len);for (i=0; i<len; ++i){printf("请输入第%d个节点的值: ", i+1);scanf("%d", &val);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){printf("分配失败, 程序终止!\n");exit(-1);}pNew->data = val;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}return pHead;
}

遍历链表

void traverse_list(PNODE pHead)
{PNODE p = pHead->pNext;while (NULL != p){printf("%d  ", p->data);p = p->pNext;}printf("\n");return;
}

判断链表是否为空

bool is_empty(PNODE pHead)
{if (NULL == pHead->pNext)return true;elsereturn false;
}

求链表长度

int length_list(PNODE pHead)
{PNODE p = pHead->pNext;int len = 0;while (NULL != p){++len;p = p->pNext;}return len;
}

插入元素

bool insert_list(PNODE pHead, int pos, int val)
{int i = 0;PNODE p = pHead;while (NULL!=p && i<pos-1){p = p->pNext;++i;}if (i>pos-1 || NULL==p)return false;//如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓//分配新的结点PNODE pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){printf("动态分配内存失败!\n");exit(-1);}pNew->data = val;//将新的结点存入p节点的后面PNODE q = p->pNext;p->pNext = pNew;pNew->pNext = q;return true;
}

删除元素

bool delete_list(PNODE pHead, int pos, int * pVal)
{int i = 0;PNODE p = pHead;while (NULL!=p->pNext && i<pos-1){p = p->pNext;++i;}if (i>pos-1 || NULL==p->pNext)return false;//如果程序能执行到这一行说明p已经指向了第pos-1个结点,并且第pos个节点是存在的PNODE q = p->pNext;  //q指向待删除的结点*pVal = q->data;  //删除p节点后面的结点p->pNext = p->pNext->pNext;//释放q所指向的节点所占的内存free(q);q = NULL;return true;}

排序链表

void sort_list(PNODE pHead)
{int i, j, t;int len = length_list(pHead);PNODE p, q;for (i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext){for (j=i+1,q=p->pNext; j<len; ++j,q=q->pNext){if (p->data > q->data)  //类似于数组中的:  a[i] > a[j]{t = p->data;//类似于数组中的:  t = a[i];p->data = q->data; //类似于数组中的:  a[i] = a[j];q->data = t; //类似于数组中的:  a[j] = t;}}}return;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LightOJ - 1027】A Dangerous Maze(概率dp,数学期望)

题干&#xff1a; You are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. The probability for choosing a door is equal for all doors. If you choose the ith door, it can either take you back to the same position wh…

由浅到深理解ROS(2)

ROS文件系统 用户可以直接参看官网&#xff1a; http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem ROS文件系统中的两个最基本的概念&#xff1a;Package和Manifest&#xff0c;即包和清单文件。 &#xff08;1&#xff09;Package是组织ROS代码的最基本单位&…

Django员工管理系统

Django员工管理系统&#xff08;ems&#xff09; 需求分析&#xff1a; 1.实现管理员的注册、登陆页面注册&#xff1a;用户名、真实名字、密码、确认密码、性别、验证码用户名需要判断是否合法、是否存在&#xff0c;loading图片提示密码和确认密码是否相同&#xff0c;load…

(4)栈

目录 栈的知识点&#xff1a; 栈的操作&#xff1a; 创建栈&#xff1a; 压栈&#xff1a; 遍历栈&#xff1a; 判断栈是否为空&#xff1a; 出栈 清空栈 这篇笔记是根据郝斌老师的上课讲义整理而得。 栈的知识点&#xff1a; 栈的定义&#xff1a;一种可以实现"…

【LightOJ - 1104】Birthday Paradox(概率,思维)

题干&#xff1a; Sometimes some mathematical results are hard to believe. One of the common problems is the birthday paradox. Suppose you are in a party where there are 23 people including you. What is the probability that at least two people in the party…

爬虫小记

中国商标网 找到正确的入口 在此页面加入全部data数据获取xhr请求包

由浅到深理解ROS(3)-命名空间

全局命名空间&#xff1a; /rosout前面的反斜杠“/”表明该节点名称属于全局命名空间。之所以叫做全局名称因为它们在任何地方&#xff08;包括代码、命令行工具、图形界面工具等的任何地方&#xff09;都可以使用。无论这些名称用作众多命令行工具的参数还是用在节点内部&…

(5)队列

目录 队列知识点&#xff1a; 循环队列&#xff1a; 队列的操作&#xff1a; 创建队列&#xff1a; 判断队列是否已满&#xff1a; 入队&#xff1a; 遍历队列&#xff1a; 判断队列是否为空&#xff1a; 出队&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得&…

【LightOJ - 1038】Race to 1 Again(概率dp,数学期望)

题干&#xff1a; Rimi learned a new thing about integers, which is - any positive integer greater than 1 can be divided by its divisors. So, he is now playing with this property. He selects a number N. And he calls this D. In each turn he randomly choose…

使用matplotlib进行简单的数据展示

import numpy as np import matplotlib.pyplot as plt# 解决中文乱码 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号# 建立一个坐标系 plt.subplot(1, 1, 1) # 指明x和y值 x np.array([1, 2…

(6)递归

目录 递归知识点&#xff1a; 递归操作&#xff1a; 阶乘的循环实现&#xff1a; 阶乘的递归实现&#xff1a; 经典的汉诺塔问题&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得。 递归知识点&#xff1a; 定义&#xff1a;一个函数自己直接或间接调用自己 。 …

由浅到深理解ROS(4)

消息和消息类型 节点能相互传递消息&#xff0c;节点之间通信也是基于消息。消息类型也就是数据类型数据类型&#xff0c;理解消息的类型很重要&#xff0c;因为它决定了消息的内容。也就是说&#xff0c;一个话题的消息类型能告诉你该话题中每个消息携带了哪些信息&#xff0…

【CodeForces - 1197C】Array Splitting(水题)

题干&#xff1a; You are given a sorted array a1,a2,…,ana1,a2,…,an (for each index i>1i>1 condition ai≥ai−1ai≥ai−1holds) and an integer kk. You are asked to divide this array into kk non-empty consecutive subarrays. Every element in the array…

Django项目部署在Centos7

把Django项目部署在Centos7下 先有一个Django项目 一个员工管理系统&#xff08;ems&#xff09; 员工管理系统 使用VMware创建一个虚拟的Linux系统 Centos7下安装MySql5.7 详细安装 Centos7下安装Python3.5 详细安装 Centos7下安装Django2.0.6 - 安装数据库驱动&#xf…

(7)树

目录 树的知识点&#xff1a; 定义&#xff1a; 专业术语&#xff1a; 操作(重点): 树的操作&#xff1a; 创建二叉树&#xff1a; 先序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 这篇笔记是根据郝斌老师的上课讲义整理而得。 树的知识点&#xf…

由浅到深理解ROS(5)- launch启动文件的理解与编写

ROS提供了一个同时启动节点管理器&#xff08;master&#xff09;和多个节点的途径&#xff0c;即使用启动文件&#xff08;launch file&#xff09;。事实上&#xff0c;在ROS功能包中&#xff0c;启动文件的使用是非常普遍的。任何包含两个或两个以上节点的系统都可以利用启动…

【CodeForces - 1199C】MP3(思维,离散化)

题干&#xff1a; One common way of digitalizing sound is to record sound intensity at particular time moments. For each time moment intensity is recorded as a non-negative integer. Thus we can represent a sound file as an array of nn non-negative integers…

Centos7下安装MySql

1、安装方式 1.1 方式一 yum安装&#xff08;推荐使用该方式&#xff09; 在CentOS中默认安装有MariaDB&#xff0c;这个是MySQL的分支 如果必须要安装MySQL&#xff0c;首先必须添加mysql社区repo通过输入命令&#xff1a; rpm -ivh http://dev.mysql.com/get/mysql-commu…

(8)排序

排序&#xff1a; 排序和查找的关系&#xff1a;排序是查找的前提&#xff0c;排序是重点。 冒泡 插入 选择 归并排序 快速排序&#xff1a;一次确定一个数的位置 #include <stdio.h>void QuickSort(int *a, int low, int high) {int pos;if(low < high){pos FindP…

由浅到深理解ROS(6)-坐标转换

转自 ROS 中对于多坐标系的处理是使用树型表示&#xff0c;在机器人自主导航中&#xff0c;ROS会构建这几个很重要的坐标系&#xff1a; base_link: 一般位于tf tree的最根部&#xff0c;物理语义原点一般为表示机器人中心&#xff0c;为相对机器人的本体的坐标系。(base_foot…