单链表创建

article/2025/9/30 10:45:35

单链表的创建与操作

链表作为基本的数据结构,学习好链表的创建与操作是数据结构入门的基础。
(小白make for myself)

单链表的创建

typedef struct Node {int data;struct Node* next;
}Node;//结构体创建,也可以使用*Node取址
Node* initList() {Node* L = (Node*)malloc(sizeof(Node));//动态分配存储单元L -> data = 0;L -> next = NULL;return L;
}

单链表的插入

单链表的头插法

所谓头插法就是在链表头节点和第一个元素之间进行插入数据元素

void headInsert(Node* L, int data)
{Node* node = (Node*)malloc(sizeof(Node));node -> data = data;node -> next = L->next;L -> next = node;L -> data ++;//头节点的数据域存放链表元素个数
}

单链表的尾插法

所谓尾插法就是在链表的尾部进行插入结点

void tailInsert(Node* L, int data) 
{Node* node = L;//复制头节点for(int i = 0; i < L -> data; i++) {node = node->next;}//遍历到原链表最后节点处Node* n = (Node*)malloc(sizeof(Node));//创建新的结点动态分配存储空间n -> data = data;n -> next = NULL;//尾结点为空node -> next = n;//使原链表尾结点指针指向新定义的结点L -> data ++;//头节点存放数据+1
}

遍历单链表的结点

通过调用子函数来实现链表的遍历以及打印到显示屏幕上

void printList(Node* L) 
{Node* node = L -> next;//创建新节点为原链表第一个结点(除头节点)while(node)//当node不为NULL时,为空时为尾结点跳出{printf("node = %d\n", node -> data);node = node -> next;//指向下一个结点}
}

链表的冒泡排序(改进)

Node* maopao(Node* head)//改进型冒泡排序 
{Node *p,*q;int num=0,j=0;q=head;//获取链表的长度 while(q!=NULL){q=q->next;num++;}//冒泡排序的基本思路 for(int i=0;i<num-1;i++){p=q=head; j=num-i-1; //减少每一趟循环中两两比较的次数 while(p->next!=NULL&&j!=0){j--;if(p->data>p->next->data){//节点的交换 if(p==head) head=p->next;else q->next=p->next;q->next=p->next;q=q->next;p->next=q->next;q->next=p;//执行完上面的过程后,为了能够让p顺利地执行移动到交换后的下一位 . p=q; }q=p; //为了能让q保持在p的前面 p=p->next; //p指针后移,即p变成了在q的前面 SortDir++;//记录比较次数}}return head;
}

综合实现

#include <stdio.h>
#include <stdlib.h>int SortDir = 0;//用作改进冒泡排序计数
int SortDir2 = 0;//记录普通排序方法 
typedef struct Node 
{int data;struct Node* next;
}Node;Node* initList() {Node* L = (Node*)malloc(sizeof(Node));L -> data = 0;L -> next = NULL;return L;
}void headInsert(Node* L, int data) {Node* node = (Node*)malloc(sizeof(Node));node -> data = data;node -> next = L->next;L -> next = node;L -> data ++;
}void tailInsert(Node* L, int data) {Node* node = L;for(int i = 0; i < L -> data; i++) {node = node->next;}Node* n = (Node*)malloc(sizeof(Node));n -> data = data;n -> next = NULL;node -> next = n;L -> data ++;
}void printList(Node* L) {Node* node = L -> next;while(node){printf("node = %d\n", node -> data);node = node -> next;}
}Node* maopao(Node* head)//改进型冒泡排序 
{Node *p,*q;int num=0,j=0;q=head;//获取链表的长度 while(q!=NULL){q=q->next;num++;}//冒泡排序的基本思路 for(int i=0;i<num-1;i++){p=q=head; j=num-i-1; //减少每一趟循环中两两比较的次数 while(p->next!=NULL&&j!=0){j--;if(p->data>p->next->data){//节点的交换 if(p==head) head=p->next;else q->next=p->next;q->next=p->next;q=q->next;p->next=q->next;q->next=p;//执行完上面的过程后,为了能够让p顺利地执行移动到交换后的下一位 . p=q; }q=p; //为了能让q保持在p的前面 p=p->next; //p指针后移,即p变成了在q的前面 SortDir++;}}return head;
}Node* maopao1(Node* head){Node *p,*q;int num=0,j=0;q=head;//获取链表的长度 while(q!=NULL){q=q->next;num++;}//冒泡排序的基本思路 for(int i=0;i<num-1;i++){p=q=head; while(p->next!=NULL){if(p->data>p->next->data){//节点的交换 if(p==head) head=p->next;else q->next=p->next;q->next=p->next;q=q->next;p->next=q->next;q->next=p;//执行完上面的过程后,为了能够让p顺利地执行移动到交换后的下一位 . p=q; }q=p; //为了能让q保持在p的前面 p=p->next; //p指针后移,即p变成了在q的前面 SortDir2++;//非改进型冒泡排序比较次数}}return head;
}int main()
{int elems[30];int n,Dir;Node* L = initList();Node* L1 = initList();printf("please enter your num of line(max ==30) \n");scanf("%d", &n);//用户输入数字数量Dir = n;//只是为了提示还能输入多少个字符for (int i = 0; i < n;i++)//用户输入int类型的循环 {printf("pleast enter your numbers one(remain%d) \n",Dir);scanf("%d", &elems[i]);//用户输入数据,便于储存tailInsert(L, elems[i]);tailInsert(L1,elems[i]); Dir--;}printf("original num:\n");printList(L);maopao (L);printf("the after nums (正序):\n");printList(L);printf("The Sort nums(改进正序次数):%d\n",SortDir);maopao1 (L1);printf("the after nums (正序):\n");printList(L1);printf("The Sort nums(普通排序正序次数):%d\n",SortDir2);SortDir = 0;system("pause");return 0;
}

运行结果

正序输入结果
在这里插入图片描述
逆序输入结果
在这里插入图片描述

乱序输入结果
在这里插入图片描述
输入、输出结果:在以上三种顺序输入数据时我们可以看到,两种冒泡排序方法都可以正确地进行排序,并输出排序结果和排序次数供我们直观地查看区别。


http://chatgpt.dhexx.cn/article/UbxgQRpG.shtml

相关文章

动态链表的创建

#include <stdio.h> //List结构样式 typedef struct node { int data; struct node *next; }Node; //创建head的空链 Node *createList() { Node *head (Node *)malloc(sizeof(Node)); if(NULL head) exit(-1); head->next NULL; return head; } Node *insertList(…

C++创建一个链表

这个是在参加面试的时候遇到的题目&#xff0c;说句实话&#xff0c;我当时不懂。 后面查了资料&#xff0c;里面写的比较仔细就不多说了。 #include <iostream> using namespace std; struct node {int data;node* next;node(int data, node* next NULL) {this->d…

如何在Python中创建与使用链表(单链表)

如何在Python中创建与使用链表&#xff08;单链表&#xff09; 最近用Python语言在Leetcode中刷题&#xff0c;接触到不少关于链表的题&#xff0c;学校目前还没有开设数据结构的课程&#xff08;开设的话应该也是以C/C语言写的&#xff09;。 因为不太了解链表使用方式&#…

循环链表的创建

循环链表的创建以及基本操作 上篇我们讲了运用头插法和尾插法创建单链表的方法&#xff0c;和两种方法的比较。 接着我们学习循环链表的创建。 只要学会了单链表的创建&#xff0c;循环链表的创建就变得很简单。 循环链表创建 单链表的结构&#xff1a; 循环链表&#xff1a…

单链表的创建

单链表类型定义 单链表是由一串结点组成的&#xff0c;其中每个结点都包含指向下一个结点的指针&#xff0c;最后一个结点的指针为空&#xff1b; 假设结点只包括一个整数和指向下一结点的指针 typedef struct node{int data;struct node *next; }LNode,*LinkList; //LNode为…

创建双向链表(详解)

双向链表操作 在学习了单链表之后&#xff0c;就顺带学习了双链表的操作。 什么是双链表&#xff1f; 双链表顾名思义&#xff0c;就是链表由单向的链变成了双向链。 使用这种数据结构&#xff0c;我们可以不再拘束于单链表的单向创建于遍历等操作&#xff0c;大大减少了在使…

如何构建一个简单链表

如何构建一个简单链表 一、 含构造函数和默认实参的结构体 typedef struct node {int data;struct node* next;node(int data 0, struct node* next NULL): data(data), next(next) {}} node; 二、 创建一个一定长度的链表 (一) 错误样例&#xff1a; int n 3;node* head …

C++:创建链表的过程详解

创建链表的过程详解 本人是一名刚开始学习算法的小白&#xff0c;今天遇到了一些关于链表的创建问题&#xff0c;查了一些资料&#xff0c;我把它们整理了一下&#xff0c;希望大家多多指教。 整体的代码&#xff1a; #include<iostream> using namespace std;struct …

链表的创建与使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、链表是什么&#xff1f; 二、链表的创建与基本操作 1.链表的创建 3.链表的头插 4.链表的尾插 5.链表的销毁 6.链表的查找 7.链表的删除…

链表的创建

目录 一&#xff1a;链表的定义 二&#xff1a;链表的改进 链表的实现可以为后面JAVA的类集框架服务。 链表是一种最简单的数据结构&#xff0c;其主要目的是依靠引用关系实现多个数据的保存。 一&#xff1a;链表的定义 定义一个Node类&#xff0c;保存的数据是String型&a…

C语言之创建链表

自己琢磨着思考了一下书上的单链表的创建案例&#xff0c;记录一下自己的理解 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>struct Student{char cName[20];int age;struct Student* pNext; }; /*节点数量*/ int iCount0;/*创建链表的函数 返回头…

如何创建链表?

链表&#xff1a; 链表的组成其实很简单&#xff0c;就是由很多结点组成的。 一个结点包含数据域和指针域&#xff0c;数据域用来存放数据&#xff0c;指针域负责指向其他结点&#xff0c;起到链接的作用。创建链表&#xff1a; 其实创建一个链表也很简单&#xff0c;在我看来…

用CodeBlocks写SFML程序

vs2019 写sfml程序简直杀鸡用牛刀&#xff0c;vs2019占用资源太大了。 所以我想到了用Dev-C&#xff0c;然而我不会配置&#xff0c;卑鄙的CSDN相关资料查阅需要VIP&#xff0c;然而VIP太贵了。 SFML官方教程是用Code::Blocks&#xff0c;于是去下一个。 setup安装........ …

[笔记]使用SFML来生成分形图片

前言 最近在上《优秀科普纪录片》时&#xff0c;看了一部有关 分形 的纪录片&#xff0c;在观看的过程中&#xff0c;想着自己也来生成一些分形图片&#xff0c;正好偶然了解到了SFML这个简单的图形库&#xff0c;所以天时地利人和&#xff0c;正好查一些资料来学习一下。 以…

SFML环境配置

材料&#xff1a; 1.visual studio 2017 2.SFML-2.5.1-windows-vc15-32-bit 准备阶段 1.进入SFML官网下载sfml-vs2017-32bit版本 2.将该压缩包解压在一个文件夹中 步骤&#xff1a; 1.进入vs&#xff0c;在上述文件夹中新建Empty Project&#xff0c;右键资源文件->添加-…

[SFML] 多个OpenGL上下文

代码 #include <iostream> #include <gl/glew.h> #include <SFML/Graphics.hpp> #include <windows.h>int main() {auto getInstance [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug [](GLenum source, GLenum type, GLuint id, GL…

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…

SFML+vs2019安装

SFMLvs2019安装 1.创建一个c空项目 2.打开属性管理器 3.添加新项目属性表 在64下单击鼠标右键 添加成功后回到属性表64找到刚刚添加的属性表单击鼠标右键–>属性单击 找到SFML安装目录的include&#xff0c;复制路径粘贴到C/C->常规–>附加包含目录 找到SFM…

SFML初学-俄罗斯方块实现

偶然看到大神使用 SFML 制作游戏&#xff0c;简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块&#xff0c;目前只实现了出现方块、消除方块的功能&#xff0c;随着慢慢学习一点点继续修改吧&#xff1b; 资源&#xff1a; 源码&#xff1a; /*******…

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…