关于数据链表详解(内有注释+示例代码)

关于单链表的创建,遍历,插入(头插法)

  1. 单链表就是结构体变量与结构体变量链接(通过结构体指针链接到一起)到一起.
  2. 我们先来创建一个静态链表初步了解一下链表结构:
#include<'iostream>

using namespace std;

//单链表节点组成=指针域+数据域
struct List
{
    
    
	int data;			//定义数据域
	struct List* next;	//定义指针域
};

int main()
{
    
    
	//创建静态链表
	struct List List1 = {
    
     1,NULL };
	struct List List2 = {
    
     2,NULL };
	struct List List3 = {
    
     3,NULL };
	//创建完成后如图1所示

	//链接链表
	List1.next = &List2;
	List2.next = &List3;

	getchar();
	return 0;
}

图一(链表最初的样子,没有链接之前,可能指向空):图一
图二(链接以后的样子):
在这里插入图片描述

  1. 动态创建一个链表=动态内存申请+模块化设计
  2. 一个数据链表因该具备如下功能:
  • 创建链表(创建一个表头表示整个链表)
  • 创建节点
  • 插入节点
  • 删除节点
  • 遍历链表

首先我们要知道一点,结构体指针如何转变为一个结构体变量:
结构体指针---->结构体变量=动态内存申请

看下面示例代码(结合图理解):

#include<iostream>

using namespace std;

//单链表节点组成=指针域+数据域
struct List
{
    
    
	int data;			//定义数据域
	struct List* next;	//定义指针域
};


struct List* createList()
{
    
    
	//动态内存申请,结构体指针-->结构体变量,head_1成为一个结构体变量
	struct List* head_1 = (struct List*)malloc(sizeof(struct List));

	//初始化
	head_1->next = NULL;
	return head_1;
}

//创建新的节点
struct List* Node(int data)
{
    
    
	struct List* newNode = (struct List*)malloc(sizeof(struct List));
	//初始化(变量使用前需要初始化)
	newNode->data = data;	
	newNode->next = NULL;
	
	return newNode;
}

//打印单链表
void Show(struct List* head)
{
    
    
	struct List* ptr = head->next;	//ptr指向打印起始位置

	while (ptr)
	{
    
    
		cout << ptr->data;	//输出节点中数据
		ptr=ptr->next;			//打印完成指向下一个节点
	}
}

//头插法,插入节点,参数:插入那个链表,插入节点的数据是多少
void InitNode(struct List* headNode, int data)
{
    
    
	//创建插入节点
	struct List* newNode = Node(data);
	newNode->next = headNode->next;	//新节点的next指向下一个节点的next
	headNode->next = newNode;	//原来表头的下一个指向新的节点
}

//删除节点,参数:删除那个节点,删除的数据是位置
void delNode(struct List* headNode,int delData)
{
    
    
	struct List* delNode = headNode->next;
	struct List* delNode_1 = headNode;
	if (delNode == NULL)
	{
    
    
		cout << "链表为空!\n";
	}
	else
	{
    
    
		while (delNode->data != delData)//参照图理解
		{
    
    
			delNode_1 = delNode;
			delNode = delNode_1->next;
			if (delNode == NULL)			//找到表尾
			{
    
    
				cout << "没有找到相关数据\n";
				return;
			}
		}
		delNode_1->next = delNode->next;
		free(delNode);
	}
		
	
}

int main()
{
    
    
	struct List* list_1 = createList();		//创建一个头表示整个链表
	InitNode(list_1, 1);					//头插法插入数据
	InitNode(list_1, 2);
	InitNode(list_1, 3);
	cout << "遍历链表:(delete数据之前):" << endl;
	Show(list_1);
	//因为是头插法,所以打印3,2,1

	
	cout <<endl<<endl<< "删除数据之后:" << endl;
	delNode(list_1, 2);
	Show(list_1);

	getchar();
	return 0;
}

1.遍历数据图
在这里插入图片描述
2.插入节点辅助理解图在这里插入图片描述
3.删除节点辅助理解图
在这里插入图片描述

注:本文参考至哔哩哔哩up主"c语言基础"教学视频,想听老师讲解的可去哔哩哔哩搜索此ID.(侵删)
声明:写该文章仅作为自己的笔记和参考,如有不对的地方还请各位大佬不吝赐教,感谢.

猜你喜欢

转载自blog.csdn.net/qq_46282869/article/details/121554730