C语言创建单链表

2023-05-16


单链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。

下面LinkList *&L ,形参上 &为C++的引用,可以用指针代替,该引用为 *类型。


链表节点结构体
这个结构体为嵌套结构体,方便管理存储数据。

typedef struct node
{
	char name[10];
	float score;
}user;

typedef struct node
{
	user data;
	struct node *next;
}LinkList;
/*如果要频繁使用结构体指针,在LinkList加入* pList。 */

初始化一个链表

初始化链表前需要在main函数中提前申请存储链表头节点的指针变量。

void InitList(LinkList*&L)
{
	L=(LinkLIst*)malloc(sizeof(LinkList));
	L->next=NULL;
}

链表插入—头插法
头插法会颠倒插入数据的顺序,最后插入的在头部,最先接入的在链表尾部。

void ListInsert(LinkList *&L,LinkList *p)
{  
    p->next=L->next;  
    L->next=p; 
} 

链表插入—尾插法
尾插法不破坏数据插入的顺序,也就是说最先接入链表的在头部,最后接入的在尾部

void ListInserted(LinkList*&L,LinkList*p)
{
	LinkList*s=L;
	while(*s->next!=NULL)
	{
		s=s->next;
	}						//找到尾部,即要接的地方
	s->next=p;
	p->next=NULL;
}

删除链表中某个节点

void delateList(LinkList *&L,int e)
{
	LinkList* p=L->next,t;
	while(p->next!=NULL)
	{
		if(p->data.score==e)
		{
			t->next=p->next;
			break;
		}
		t=p;
		p=p->next;
	}
	free(p);
}

销毁链表

void disList(LinkList *&L)
{
	LinkList *p=L->next,t;
	while(p!=NULL)
	{
		t=p;
		free(t);
		p=p->next;
	}
	free(L);
}

判断链表是否为空

bool emptyList(LinkList*&L)
{
	return (L->next==NULL);
}

代码实例:(纯C手打,与上面的函数略有不同。)

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

typedef struct node
{
	int physical;
	struct node *next;
}LinkList,*pLinkList;//纯C手打,暂时抛弃C++的引用&

void shanchu(pLinkList pl,int score)
{
	pLinkList pre=pl,l=pl->next;
    while(l!= NULL)
    {
        if(l->physical==score)
        {
			pre->next=l->next;
			free(l);
			return;
		}
		pre=l;
		l=l->next;
	}
	printf("没有找到该节点!\n");
}

void zeng(pLinkList pl)
{
	pLinkList l=(pLinkList)malloc(sizeof(LinkList));
	
	printf("请输入物理成绩:");
	scanf("%d",&l->physical);
	
	l->next=pl->next;
	pl->next=l;
}

void DaYinLianBiao(pLinkList pl)
{
	while(pl!=NULL)
	{
		printf("成绩:%d ",pl->physical);
		pl=pl->next;
	}
}

void chushihua(pLinkList *p)
{
	*p=(pLinkList)malloc(sizeof(LinkList));
	
	(*p)->physical=60;
	
	(*p)->next=NULL;
}

int main()
{
	int length,score;
	pLinkList L=NULL; //为了节约内存和方便销毁链节点,凡要用到内存空间,一律使用指针加malloc()申请内存代替实际变量

	chushihua(&L);  //对头节点进行操作
	
	printf("头节点:L->physical=%d\n",L->physical);
	
	printf("请输入增加节点个数:");
	scanf("%d",&length);
	
	while(length--)
	{
		zeng(L);
	}
	
	DaYinLianBiao(L);
	printf("\n请输入你要删除的节点的分数(头节点不能删除):");
	scanf("%d",&score);
	shanchu(L,score);
	printf("链表为:\n");
	DaYinLianBiao(L);
	
	system("pause");
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言创建单链表 的相关文章

随机推荐

  • 十五、Linux驱动之USB鼠标驱动

    1 如何编写USB鼠标驱动 结合十四 Linux驱动之USB驱动分析中的分析 xff0c 我们开始写一个USB鼠标驱动 USB的驱动可以分为3类 xff1a SoC的USB控制器的驱动 xff0c 主机端USB设备的驱动 xff0c 设备上
  • kazam录制视频转码

    Ubuntu安装kazam录制视频转码问题 录制转码 录制 在ubuntu下录制视频发现录制mp4视频在windows中大部分无法打开播放只有potplayer可以 xff0c 主要是两边视频格式不支持 xff0c 为此需要进行转码 转码
  • layui实现文件分片上传

    html代码 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt layui lt title gt lt meta
  • C++ day42 C++的其他类库(除STL外)

    STL已经提供了一个非常好的可重用代码源 xff0c STL工具可以被用来解决很多编程问题了 xff0c 但是C 43 43 还是觉得不够 xff0c 在STL之外 xff0c 也提供了一些模板类 xff0c 这些模板类基本都是用来做一件很
  • python爬虫beautifulsoup详细教程

    BeautifulSoup4是爬虫必学的技能 BeautifulSoup最主要的功能是从网页抓取数据 xff0c Beautiful Soup自动将输入文档转换为Unicode编码 xff0c 输出文档转换为utf 8编码 Beautifu
  • pandas用法详解

    一 生成数据表 1 首先导入pandas库 xff0c 一般都会用到numpy库 xff0c 所以我们先导入备用 xff1a import numpy as np import pandas as pd 2 导入CSV或者xlsx文件 xf
  • 程序员读书顺序!

    程序猿的读书历程 xff1a xx语言入门 gt xx语言应用实践 gt xxx语言高阶编程 gt xxx语言的科学与艺术 gt 编程之美 gt 编程之道 gt 编程之禅 gt 颈椎病康复指南
  • 基于STM32的倾斜仪设计(二)—— 硬件设计(2)

    2 4控制电路 本实验中选用的控制核心是STM32系列单片机 xff0c 具体型号为STM32F103R8T6 STM32F103R8T6是一款嵌入式 微控制器集成电路 xff0c 是ST旗下的一款常用的增强型系列微控制器 此芯片工作电压为
  • win32多媒体定时器

    win32多媒体定时器 因为编程需要以1ms为周期调用一个函数 xff0c 故在Windows平台上测试了一些定时器 xff0c 并进行比较 xff0c 最终选用timeSetEvent作为最终选项 几个拉跨的定时器精度 select选择模
  • 树莓派005_L298N电机控制板

    硬件接口 ENA IN1 IN2 控制左边的电机A xff0c ENB IN3 IN4控制右边的电机B 以上六个全部接GPIO口 xff0c 可通过pwm控制ENA ENB实现调速 43 12V为外接电源正极接入口 GND为外接电源负极接入
  • Vue实现Enter键查询

    单个条件 xff1a 64 keyup span class token punctuation span enter span class token punctuation span native span class token op
  • 图文详解教你在线换系统(无须U盘)

    1 先去msdn下载需要安装的系统 建议不要下载到系统盘 系统下载传送门 2 系统下载后 xff0c 双击打开找到setup xff0c 然后以管理员权限打开 3 打开windows安装界面后 xff0c 选择更改windows安装程序下载
  • 从零开始写一个图像处理程序之一(BMP彩色图转灰度图)

    图像二值化可以直接调用opencv的二值化函数去完成处理 xff0c 但是不利用OpenCV从头手写一个处理图片程序未尝不是一件有意思的事情 xff0c 就拿BMP图片为例去做一个 BMP图像 xff1a BMP xff08 Bitmap
  • 智能革命和未来社会《智能时代--大数据和智能革命重新定义未来》

    通过区块链 xff08 Block Chain xff09 在未来跟踪每一件商品从制造出来到被消费的完整行踪 比特币在一定程度上起到货币的作用 xff0c 并且成为全球很安全的洗钱工具 xff0c 源于它背后的一个技术 区块链 block即
  • Git 版本回退方法

    场景一 xff1a 如果想将代码恢复到之前某个提交的版本 xff0c 且那个版本之后提交的版本都不要了 xff0c 就可以使用 git rest 原理 xff1a git reset的作用是修改HEAD的位置 xff0c 即将HEAD指向的
  • Antd form表单的使用、设值、取值、清空值

    1 使用 this props form getFieldDecorator 34 key 34 lt Input gt 3 设值 this props form setFieldsValue key 39 123 39 2 取值 this
  • 静态类,方法,成员

    说起静态类 xff0c 你可能会联想到实例类 这两者并不难区分 xff0c 前者 静态类 只在内存中创建一个 xff0c 而后者 实例类 则是每次实例化后 xff0c 就会再内存创建一份 今天来简单聊一下静态类的理解 代码情景 xff1a
  • shell脚本批量执行可执行文件

    touch一个test sh文件 xff0c 按下方例子vim写入 xff1a span class token comment bin bash span span class token function echo span span
  • git 本地改动了,不保留,直接拉取线上最新代码

    如果您在本地做了改动 xff0c 但是又不想保留这些改动 xff0c 可以使用以下命令强制拉取远程最新代码 xff0c 覆盖掉本地代码 xff1a span class token function git span fetch all s
  • C语言创建单链表

    单链表 链表是一种物理存储单元上非连续 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 xff08 链表中每一个元素称为结点 xff09 组成 xff0c 结点可以在运行时动态生成 每个结