(郝斌讲学)数据结构学习篇(三)---链表的CRUD操作

024.链表的创建和链表遍历的算法演示

<span style="font-size:14px;">#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 *

//函数声明
PNODE create_list(void);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
bool insert_list(PNODE, int, int);
bool delete_list(PNODE, int, int *);
void sort_list(PNODE);

int main(void)
{
	PNODE pHead = NULL;//等价于struct Node *pHead = null;
	int val;

	pHead = create_list();
	traverse_list(pHead);

	insert_list(pHead, 2, 33);
	traverse_list(pHead);

	if(delete_list(pHead, 4, &val))
	{
		printf("删除成功,您删除的元素是:%d\n", val);
	}
	else{
		printf("删除失败!您删除的元素不存在!\n");
	}
	traverse_list(pHead);

	int len = length_list(pHead);
	printf("链表的长度是 %d\n", len);

	return 0;
}

//创建一个非循环链表
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;
	else
		return false;
}

//链表的长度
int length_list(PNODE pHead)
{
	PNODE p = pHead->pNext;
	int len = 0;

	while(NULL != p)
	{
		++len;
		p = p->pNext;
	}
	return len;
}

//链表的排序
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)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}

	return;
}

//在pHead所指向链表的第pos个节点的面前插入一个新的结点,该节点的值是val,
//并且pos的值从1开始
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;

	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(NULL == pNew)
	{
		printf("动态分配内存失败!\n");
		exit(-1);
	}
	pNew->data = val;
	PNODE q = p->pNext;
	p->pNext = pNew;
	pNew->pNext = q;
}

//删除一个元素
bool delete_list(PNODE pHead, int pos, int *pVal)
{
	int i = 0;
	PNODE p = pHead;

	while(NULL != p && i<pos-1)
	{
		p = p->pNext;
		++i;
	}

	if(i>pos-1 || NULL==p)
		return false;

	PNODE q = p->pNext;
	*pVal = q->data;
	//删除p节点后面的结点
	p->pNext = p->pNext->pNext;
	free(q);
	q = NULL;
}</span>

算法:

狭义的算法是与数据的存储方式密切相关

广义的算法是与数据的存储方式无光。

泛型:

利用某种技术达到的效果是:不同的存数方式,执行的操作是一样的。

外部的操作是一样的,其实内部的实现是不一样的。

连续存储【数组】

优点:存储速度快

缺点:插入删除元素慢,空间通常是有限的

离散存储【链表】

优点:空间没有限制,插入,删除元素快

缺点:存储的速度很慢。

时间: 2024-08-25 04:27:58

(郝斌讲学)数据结构学习篇(三)---链表的CRUD操作的相关文章

小猪的数据结构学习笔记(三)

小猪的数据结构学习笔记(三) 线性表之单链表 本章引言: 上一节中我们见识了第一个数据结构--线性表中的顺序表; 当你把操作的代码自己写几遍就会有点感觉了,如果现在让你写顺序表的 插入算法,你能够想出大概的代码么?如果可以,那么你就可以进入新的章节了; 否则,还是回头看看吧!在本节,我们将迎来线性表的链式表示--单链表 单链表和顺序表有什么优势和劣势呢?单链表的头插法和尾插法有什么不同呢? 请大家跟随笔者的脚步来解析线性表中的单链表把! 本节学习路线图 路线图解析: ①先要理解顺序表和单链表各自

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Lambda表达式学习篇三(流-下)

一.重构遗留代码 为了进一步解释如何重构一流代码,本节将距离说明如何将一段使用循环进行集合操作的代码,重构成基于Stream的操作. 假定选取一组专辑,找出其中所有长度大于一分钟的曲目名称.下面是一个例子,首先初始化一个set对象,用来保存找到的曲目名称.然后使用for循环遍历所有专辑,每次循环中在使用一个for循环遍历每张专辑的每首曲目,检查其长度是否大于60秒,如果是,则将该曲目的名称加入set对象. 例如:遗留代码:找出代码大于一分钟的曲目 1 private static Set<Str

(郝斌讲学)数据结构学习篇(七)---树

树定义        专业定义:有且只有一个称为根的节点,有若干个互不相交的子树,这些子树的本身也是一棵树.        通俗的定义:树是由节点和边组成:每个节点只有一个父节点但可以有多个子节点:但有一个节点例外,该节点没有父节点,此节点称为根节点.   专业术语        节点 父节点 子节点 子孙 堂兄弟 深度 深度:从根节点到底层节点的层数称之为深度.根节点是第一层. 叶子节点:没有子节点的节点. 非终端节点:实际上就是非叶子节点. 度:子节点的个数称之为度.   树的分类     

(郝斌讲学)数据结构学习篇(五)---队列的CRUD操作

队列 什么是队列? 一种可以实现"先进先出"的存储结构. 出队  入队  -->>队列 出栈  压栈  -->>栈 链式队列 ---用链表实现的 静态队列 ---用数组实现的 静态队列通常必须是循环队列.. 039.循环队列需要几个参数来确定极其含义的讲解 front代表的是队列的第一个元素 rear代表的是队列的最后一个有效元素的下一个元素 队列为空: front和rear的值相等,但不一定为零 队列初始化 front和rear的值都是零. 循环队列入队的伪算

(郝斌讲学)数据结构学习篇(四)---栈的CRUD操作

栈 栈类似于箱子. 静态栈.动态栈. 关于栈的操作 #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE, *PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK, *PSTACK; void init(PSTACK); vo