首页 > 其他分享 >链表的学习

链表的学习

时间:2024-10-28 12:46:03浏览次数:9  
标签:Node 学习 head struct temp next 链表 节点

介绍 

每个节点都会有data数据域和指针域

data数据域可以存放该节点对应的任何数据类型值比如int char等

next指针域是指向列表中下一个节点的引用指针

 

接下来我们需要给这些节点的data数据域赋值,分别为10,20,30现在每个节点中都有对应的值

接下来我们应该将这些节点连接起来

首先我们使head的next指向middle

这会使middle的内存地址2024存储在head的next里,那么我们使用head的next即可访问到middle

再使middle的next指向last即3024

last的后续没有节点,所以last的next为Null

 

 代码实现

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

// 定义节点结构体
struct Node {
    int data;               // 节点数据
    struct Node* next;      // 指向下一个节点的指针
};

int main() {
    struct Node *head, *middle, *last;

    // 分配内存
    head = (struct Node*)malloc(sizeof(struct Node));
    middle = (struct Node*)malloc(sizeof(struct Node));
    last = (struct Node*)malloc(sizeof(struct Node));

    // 设置节点数据
    head->data = 10;
    middle->data = 20;
    last->data = 30;

    // 链接节点
    head->next = middle;
    middle->next = last;
    last->next = NULL; 

    // 遍历链表并打印数据
    struct Node *temp = head;
    while(temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    // 释放内存
    free(head);
    free(middle);
    free(last);

    return 0;
}

头插法 

代码实现

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

// 定义节点结构体
struct Node {
    int data;               // 节点数据
    struct Node* next;      // 指向下一个节点的指针
};

// 初始化头指针
struct Node* head = NULL; 

// 插入新节点的函数
void Insert(int x) {
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("Memory allocation failed\n");
        return;
    }
    newNode->data = x;
    newNode->next = head;
    head = newNode;
}

int main() {
    // 插入初始节点
    Insert(10);
    Insert(20);
    Insert(30);

    // 遍历链表并打印数据
    struct Node *temp = head;
    while(temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");

    // 释放内存
    temp = head; // 先从头开始释放
    while (temp != NULL) {
        struct Node *nextNode = temp->next; // 记录下一个节点
        free(temp); // 释放当前节点
        temp = nextNode; // 移动到下一个节点
    }

    return 0;
}

解释  

 尾插法

代码实现

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

// 定义节点结构体
struct Node {
    int data;               // 节点数据
    struct Node* next;      // 指向下一个节点的指针
};

// 全局头指针
struct Node* head = NULL;

// 在链表末尾插入新节点
void inserLast(int x) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = NULL;

    if (head == NULL) {
        head = newNode; // 如果链表为空,直接将新节点作为头节点
    } else {
        struct Node* lastNode = head;
        while (lastNode->next != NULL) {
            lastNode = lastNode->next; // 遍历到链表的最后一个节点
        }
        lastNode->next = newNode; // 将新节点添加到链表末尾
    }
}

int main() {
    // 插入初始节点
    inserLast(10);
    inserLast(20);
    inserLast(30);

    // 遍历链表并打印数据
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next; // 移动到下一个节点
    }
    printf("\n");

    // 释放内存
    temp = head; // 先从头开始释放
    while (temp != NULL) {
        struct Node* nextNode = temp->next; // 记录下一个节点
        free(temp); // 释放当前节点
        temp = nextNode; // 移动到下一个节点
    }

    return 0;
}

解释 

 

删除

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 定义节点结构体
struct Node {
    int data;               // 节点数据
    struct Node* next;      // 指向下一个节点的指针
};

// 全局头指针
struct Node* head = NULL;

bool deleteNode(struct Node **head, int Key)
{
	struct Node *temp;
	if((*head)->data == Key) {
		temp =*head;
		*head = (*head)->next;
		free(temp);
		return true;
	}else{
		struct Node *pre = *head;
		while(pre->next != NULL){
			if(pre->next->data == Key)
			{
				temp = pre->next ;
				pre->next = pre->next->next ;
				free(temp);
				return true;
			}else{
				pre = pre->next ;
				
			}
			return false;
		}
	}
	
}

// 在链表末尾插入新节点
void inserLast(int x) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = NULL;

    if (head == NULL) {
        head = newNode; // 如果链表为空,直接将新节点作为头节点
    } else {
        struct Node* lastNode = head;
        while (lastNode->next != NULL) {
            lastNode = lastNode->next; // 遍历到链表的最后一个节点
        }
        lastNode->next = newNode; // 将新节点添加到链表末尾
    }
}

int main() {
    // 插入初始节点
    inserLast(10);
    inserLast(20);
    inserLast(30);

    // 遍历链表并打印数据
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next; // 移动到下一个节点
    }
    printf("\n");
    
    
    deleteNode(&head,20);
	 // 遍历链表并打印数据
    temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next; // 移动到下一个节点
    }
    printf("\n");
    
    

    // 释放内存
    temp = head; // 先从头开始释放
    while (temp != NULL) {
        struct Node* nextNode = temp->next; // 记录下一个节点
        free(temp); // 释放当前节点
        temp = nextNode; // 移动到下一个节点
    }

    return 0;
}

解释 

搜索

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 定义节点结构体
struct Node {
    int data;               // 节点数据
    struct Node* next;      // 指向下一个节点的指针
};

struct Node* searchNode(struct Node*head, int key)
{
	struct Node* temp = head;
	while(temp != NULL){
		if(temp->data == key){
			return temp;	
		}
		temp = temp->next ;
	}
	return NULL;
}
// 全局头指针
struct Node* head = NULL;

bool deleteNode(struct Node **head, int Key)
{
	struct Node *temp;
	if((*head)->data == Key) {
		temp =*head;
		*head = (*head)->next;
		free(temp);
		return true;
	}else{
		struct Node *pre = *head;
		while(pre->next != NULL){
			if(pre->next->data == Key)
			{
				temp = pre->next ;
				pre->next = pre->next->next ;
				free(temp);
				return true;
			}else{
				pre = pre->next ;
				
			}
			return false;
		}
	}
	
}

// 在链表末尾插入新节点
void inserLast(int x) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = NULL;

    if (head == NULL) {
        head = newNode; // 如果链表为空,直接将新节点作为头节点
    } else {
        struct Node* lastNode = head;
        while (lastNode->next != NULL) {
            lastNode = lastNode->next; // 遍历到链表的最后一个节点
        }
        lastNode->next = newNode; // 将新节点添加到链表末尾
    }
}

int main() {
	int i;
    // 插入初始节点
    inserLast(10);
    inserLast(20);
    inserLast(30);

    // 遍历链表并打印数据
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next; // 移动到下一个节点
    }
    printf("\n");
    
    i = searchNode(head, 30);
    printf("%d\n", i);
    

    

    // 释放内存
    temp = head; // 先从头开始释放
    while (temp != NULL) {
        struct Node* nextNode = temp->next; // 记录下一个节点
        free(temp); // 释放当前节点
        temp = nextNode; // 移动到下一个节点
    }

    return 0;
}

解释

 

标签:Node,学习,head,struct,temp,next,链表,节点
From: https://blog.csdn.net/2301_79790385/article/details/143244690

相关文章

  • 强化学习的数学原理-04值迭代与策略迭代
    目录ValueiterationalgorithmPolicyiterationalgorithmTruncatedpolicyiterationalgorithmValueiterationalgorithm\[v_{k+1}=f(v_k)=\max_{\pi}\left(r_{\pi}+\gammaP_{\pi}v_k\right)\:,\:k\:=\:1,2,3,...\]算法可以被分为两步去做:\(Step1......
  • 工控知识学习
    @目录1.电机减速机、扭矩2.运动控制相关1.运动控制简介2.伺服电机、步进电机1.伺服电机2.步进电机3.总结3.点位运动、连续运动、直线和圆弧插补运动4.软限位和正限位5.脉冲当量、脉冲数、脉冲频率6.回零:光电开关和编码器信号7.前瞻4.运动控制卡1.简介2.运动控制卡和PLC的区别3.运......
  • 深度学习入门笔记——Transform的使用
    Transfrom是什么?可以看作是一个图像处理的工具箱,通过查看Transform类可以找到不同的图像处理方法更准确的说,Transform中有各种类的的定义,我们可以通过继承或者构造这些类,然后调用里面的方法来实现相应的功能可以通过结构来便捷的查看transform中的类和方法,然后实现对应的对象......
  • MySQL:临时表学习
    前言在MySQL中,临时表(TemporaryTable)是一种非常有用的工具,可以帮助我们在执行复杂查询时存储临时数据。临时表的存在时间仅限于会话期,当会话结束后,临时表自动销毁。【数据库会话指的是用户连接到数据库并执行命令的整个时间段。一个会话从用户连接到数据库开始,直到用户......
  • 立即执行函数表达式(Immediately Invoked Function Expression, IIFE)的学习
    一、立即执行函数表达式(ImmediatelyInvokedFunctionExpression,IIFE)。这种模式在JavaScript中常用于创建一个独立的作用域,以避免变量污染全局命名空间。常见的例子可以分解如下:(function(window){//这里可以写任何需要执行的代码})(window);在这个例子中,funct......
  • 142. 环形链表 II Golang实现
    #题目描述:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • Delphi10.3原生控件学习,基础学习
    --------=====================原生控件学习=================------------------------------------Delphi10.3的PageControl1使用方法大全Delphi10.3RadioGroup1多选一的组件用法Delphi10.3里Memo1的查找--替换---功能Action实现TMemo关键字代码着色Delphi10.3中CheckL......
  • C++学习,标准库 <cstdlib>
    <cstdlib> 是C++标准库中的一个头文件,提供了各种通用工具函数,包括内存分配、进程控制、环境查询、排序和搜索、数学转换、伪随机数生成等。这些函数最初来自C标准库 <stdlib.h>,在C++中进行了标准化和扩展。字符串转换函数calloc():分配指定数量和大小的内存空间,并将其......
  • 初级python代码编程学习----简单的查看当前ip地址的图形化工具
    以下是一个使用Python的tkinter库创建图形化界面来查看当前IP地址的工具代码:代码importtkinterastkimportsocketdefget_ip_address():try:s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect(("8.8.8.8",80))ip......
  • JavaWeb知识点总结 我的学习笔记
    JavaWeb我的学习笔记一、动态网页开发1.动态网页2.系统架构C/S架构B/S架构B/S与C/S的比较3.URL通信三要素4.Tomcat服务器二、Servlet1.Servlet简介2.Servlet快速入门入门样例执行原理3.Servlet的体系结构4.servlet的十大方法5.Servlet生命周期6.在web.xml中配置servl......