DataStructures——单链表学习总结1

目录

1)单链表结构体的创建

2)单链表的尾插、头插、尾删、头删以及链表的输出

2.1)进行测试单链表基础函数是否功能正常

3)单链表的查找函数

3.1)测试验证函数功能是否正常

4)链表中任意位置数据的插入(前插)

4.1)验证测试功能是否正常


1)单链表结构体的创建

首先头文件的定义,对于单链表的结构体进行初始化,以及对用到的链表函数进行声明。

#pragma once
#include <stdio.h>
#include <stdlib.h>

typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLNode;

void SListprint(SLNode* phead);//链表打印函数

void SListPushBack(SLNode** pphead, SLTDataType x);//链表尾插入函数

void SListPushFront(SLNode** pphead, SLTDataType x);//链表头插入函数

void SListPopback(SLNode** pphead );//链表尾删

void SListPopFront(SLNode** pphead);//链表头删

void SListInser(SLNode** pphead, SLNode* pos, SLTDataType x);//链表节点插入函数




SLNode* SListFind(SLNode* phead, SLTDataType x);
SLNode* BuyListNode(SLTDataType x);

2)单链表的尾插、头插、尾删、头删以及链表的输出

#include "reSL.h"
//链表输出函数
//******************************************
void SListprint(SLNode* phead)
{
	SLNode* cur = phead;//定义一个基地指针,进行链表的输出
	while (cur != NULL)//基地指针不为空,就一直循环
	{
		printf("%d\n", cur->data);//输出本次找到节点的数据data
		cur = cur->next;//下一次输出作准备
	}
}
//******************************************

//链表尾插
//******************************************
void SListPushBack(SLNode** pphead, SLTDataType x)
{
	//SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	//newnode->data = x;
	//newnode->next = NULL;
	//上面三条,是链表节点还没封装
	SLNode* newnode = BuyListNode(x);//把新节点,封装成为一个子函数,调用即可

	if (*pphead == NULL)
	{
		*pphead = newnode; //判断链表是否为空,空的话,让链表头指针指向新节点
	}
	else//链表不为空,我们需要找到尾节点
	{
		// 找到尾节点
		SLNode* tail = *pphead;//定义一个基地指针,来寻找尾节点
		while (tail->next != NULL)//寻找尾节点
		{
			tail = tail->next;
		}

		tail->next = newnode;//找到尾节点了,让尾节点的next指向新的节点newnode
	}

}
//******************************************

//链表节点创建函数
//******************************************
SLNode* BuyListNode(SLTDataType x)
{
	// 1M = 1024KB = 1024 * 1024 Byte
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}

	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}
//******************************************

//链表头插
//******************************************
void SListPushFront(SLNode** pphead, SLTDataType x)
{
		SLNode* newnode = BuyListNode(x);//创建一个新的链表节点newnode
		newnode->next= *pphead;//让新节点的next,指向链表开始的位置,也就是头指针指向的
		*pphead = newnode;//让链表头指针指向新的节点

	
}
//******************************************

//链表尾删
//******************************************
void SListPopback(SLNode** pphead )
{
	if (*pphead == NULL)//判断头节点是否为空
	{
		return;//空的话退出,没有东西可以删
	}

	if(( *pphead)->next == NULL)//判断是不是只有一个节点的情况
	{
		free(*pphead);//是的话,释放这个空间
		*pphead = NULL;//让链表头指针变为空指针
	}
	else//两个节点以上情况
	{
		SLNode* tail = *pphead;//定义一个基地指针,让它开始等于头指针
		while (tail->next->next)//判断第二个节点的next是不是指向了NULL
		{
			tail = tail->next;//如果第二个节点next没有指向NULL,则进行移动基地指针
			//让它到第二个节点的位置去

		}
		free(tail->next);//上面的循环结束,说明基地指针tail现在在倒数第二个节点的位置
						//现在可以删掉最后一个节点,释放内存空间
		tail->next = NULL;//这个很关键,需要把倒数第二个节点的nxet指向NULL,因为链表都是以NULL结尾
	}
}
//******************************************

//链表头删
//******************************************
void SListPopFront(SLNode** pphead)
{
	if (*pphead == NULL)
	{
		return;
	}
	SLNode* next = (*pphead)->next;//设置链表第二个节点
	free(*pphead);//释放链表第一个节点
	*pphead = next;//让链表头指针指向第二个节点,作为新链表的头结点


}
//******************************************

2.1)进行测试单链表基础函数是否功能正常


void test01()
{
	SLNode* PList = NULL;
	SListPushBack(&PList,2);//链表尾插入函数
	SListPushBack(&PList,1);//链表尾插入函数
	SListPushBack(&PList,2);//链表尾插入函数
	SListPushFront(&PList,5);//链表尾插入函数
	SListprint(PList);
	//输出为5212
	SListPopback(&PList);//链表尾删
	SListPopFront(&PList);//链表头删
	SListprint(PList);
	//输出为21
	SLNode* pos = SListFind(PList,1);
	SListInser(&PList,pos,100);
	SListprint(PList);

}

2.2)测试结果 

链表可以正常进行头插和尾插

 

3)单链表的查找函数

//链表查找数据函数
SLNode* SListFind(SLNode* phead, SLTDataType x)
{
	if (phead == NULL)//为了防止链表为空
	{
		return;
	}
	SLNode* cur = phead;//定义一个基地指针
	while (cur)
	{
		if (cur->data == x)//判断查找的数据是否相等
		{
			return cur;//相等的话,返回指针
		}
		else
		{
			cur = cur->next;//不相等的话,进行下一个节点查找
		}
		
	}
	return NULL;//如果都没找到的话,返回空
}
//******************************************

3.1)测试验证函数功能是否正常

void test02()//验证查找函数 SListFind
{
	SLNode* PList = NULL;
	SListPushBack(&PList, 2);//链表尾插入函数
	SListPushBack(&PList, 5);//链表尾插入函数
	SListPushBack(&PList, 8);//链表尾插入函数
	SListPushBack(&PList, 3);//链表尾插入函数
	SListPushBack(&PList, 4);//链表尾插入函数
	SListPushBack(&PList, 7);//链表尾插入函数
	//2\5\8\3\4\7
	SLNode* pos1 = SListFind(PList, 8);
	if (pos1)
	{
		pos1->data = 100;//找到8,并且修改为100
	}
	SListprint(PList);
	
	//2\5\100\3\4\7
}

4)链表中任意位置数据的插入(前插)

//在POS位置前插入一个节点
void SListInser(SLNode** pphead, SLNode* pos, SLTDataType x)
{
	SLNode* newnode = BuyListNode(x);//创建一个新的链表节点newnode

	if (*pphead == NULL)
	{
		return;
	}
	if (*pphead == pos)//如果是头节点,进行头插入
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}
	else//两个以上节点
	{
		SLNode* prepos = *pphead;//定义一个寻找pos前一个位置的节点
		while (prepos->next != pos)//找pos的位置
		{
			prepos = prepos->next;//进行移位
		}
		
		prepos->next = newnode;//找pos前一个位置的节点,进行插入
		newnode->next = pos;
	}
}
//******************************************

4.1)验证测试功能是否正常

void test03()
{
	SLNode* PList = NULL;
	SListPushBack(&PList, 5);//链表尾插入函数
	SListPushBack(&PList, 2);//链表尾插入函数
	SListPushBack(&PList, 5);//链表尾插入函数
	SListPushBack(&PList, 2);//链表尾插入函数
	SListPushBack(&PList, 5);//链表尾插入函数
	SListPushBack(&PList, 5);//链表尾插入函数
	SLNode* pos = SListFind(PList, 5);
	int i = 1;
	while (pos !=NULL)
	{
			
		
			printf("第%d个pos节点:%p->%d\n",i++,pos,pos->data);
			SListInser(&PList,pos,520);//找到的话,在前面插入100
			pos = SListFind(pos->next, 5);//在第一次的基础上,进行下一次查找
			SListprint(PList);
	
	}
	
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python数据结构是指在Python编程语言中可用的数据类型和数据结构,包括列表、元组、字典、集合等。这些数据结构可以用于存储和操作数据,使得Python编程更加高效和灵活。Python的数据结构具有易于使用、灵活性强、可扩展性好等特点,因此在数据分析、机器学习、人工智能等领域得到了广泛应用。 ### 回答2: Python数据结构是Python编程语言中的基本概念,指用于存储和组织数据的数据类型和数据结构。数据类型包括数字、字符串、布尔值、列表、元组、字典和集合等。数据结构是指相互之间存在一定关系的数据组成的组合,如栈、队列、链表、树、图等。 Python中最常用的数据结构有: 1. 列表(list):包含一组有序的元素,可以是任何数据类型,并且是可变的。 2. 元组(tuple):与列表类似,但是不可变,一旦创建就不能修改。 3. 字典(dictionary):使用键值对存储数据,键是可哈希的数据类型(即可通过哈希算法得到唯一标识符的数据类型),值可以是任何数据类型。 4. 集合(set):无序的不重复元素的集合。可以进行交、并、差等集合操作。 5. 栈(stack):先进后出的数据结构,可以用列表实现。 6. 队列(queue):先进先出的数据结构,可以用列表实现,也可以使用Python标准库中的队列模块(queue)或双端队列模块(collections.deque)。 7. 堆(heap):特殊的二叉树结构,最小堆和最大堆可以通过heapq库来实现。 8. 树(tree):节点之间存在父子关系,经常用于搜索和排序。Python没有内置树结构,但可以使用第三方库来实现。 Python数据结构非常灵活和易于使用,可以根据不同的需求选择不同的数据结构。掌握Python数据结构对于有效编程至关重要。 ### 回答3: Python 数据结构是指一组数据的组织方式,是一种管理和组织数据的方法。Python 中的数据结构可以按照不同的目的和需求进行分类,主要包括以下几种类型: 1. 列表(Lists):列表是 Python 中最常用的数据结构之一,它可以存储多个值,并允许对这些值进行操作和处理。列表中的元素可以是任何数据类型,包括数字、字符串、布尔值和其他列表等。 2. 元组(Tuples):元组类似于列表,但是它们是不可变的,一旦创建就不能修改其内容。元组通常用于存储不变的数据,如各种常量、元组等。 3. 字典(Dictionaries):字典是一种映射类型的数据结构,用于存储 key-value 对,其中 key 和 value 都可以是任何数据类型。字典的主要特点是可变性和无序性。 4. 集合(Sets):集合是一个无序的不重复元素序列,可以用于去重和求交集、并集、差集等集合运算。 5. 栈(Stacks):栈是一种后进先出(LIFO)的数据结构,常用于递归函数、表达式求值和历史记录中的后退操作。 6. 队列(Queues):队列是一种先进先出(FIFO)的数据结构,常用于处理排队等待的任务。 Python 数据结构的实现可以利用内置函数或第三方库,如 NumPy、Pandas、SciPy 等,这些库封装了很多高效的数据结构和算法,并提供了丰富的功能函数和方法,可以大大提高数据处理和分析的效率和准确性。对于 Python 开发者来说,了解和掌握不同类型的数据结构以及其使用方法,是编写高效、可靠和易于维护的程序的关键之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值