C语言实现链表的增删查改以及OJ题讲解

目录

           动态申请一个节点

           单链表的打印

           单链表的尾插

           单链表的头插

           单链表的尾删

           单链表的头删

           单链表查找

           单链表在pos位置之后插入x

           单链表删除pos位置之后的值

           单链表的销毁 

           最后呢,我会挑几道关于链表的OJ题给大家讲解一下         

                                         

 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。

C语言实现链表的增删查改以及OJ题讲解_第1张图片

 在正式进入我们链表的增删查改实现之前,我先给大家将一下一个关于C++的语法,因为链表如果要用纯C实现的话有很多地方要用到二级指针,所以我掺杂了一些C++的语法。

C++引用:

引用呢,在C++中是非常常见的,它的底层实现其实也是指针,不过用起来和指针有一些不同的地方,引用本质上就是给变量取了一个别名,而你修改别名就会影响自己本身,在变量类型后面加&它的类型就成了引用类型,如下:

C语言实现链表的增删查改以及OJ题讲解_第2张图片

 这段代码我们可以发现我调用fun函数将p1传给了引用类型int*& p,我们会发现我们如果改变*p,*p1也跟着改变了,其次当形参是引用类型,实参传过去是不需要取地址的,只需要写变量名即可,为了让大家更好的理解引用,我带大家调试去看一看,p1的地址和p的地址是不是相同的。                                                     

如下: 

C语言实现链表的增删查改以及OJ题讲解_第3张图片

 C语言实现链表的增删查改以及OJ题讲解_第4张图片

 通过调试我们可以发现当箭头在fun(p1)的时候p1的地址为0x004ff97c,而当箭头到fun函数里面时,可以看到p的地址也为0x004ff97c,所以p1和p其实就是同一个变量,用引用的话来说,p就是p1的别名。

接下来我们进入到链表增删查改的实现:

首先通过上面链表的概念我们可以知道链表在内存中其实是不连续的,因为它们的地址是不相等的,只不过逻辑上是连续的,链表是通过结构体里面的指针找到下一个节点的地址,从而实现逻辑上的连续。

结构体的设计如下:

typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SLTNode;

这个结构体里面存放的是,一个data也就是要存放类型的值,如int,double,char,这里我还是和之前实现顺序表一样,将int typedef成SLTDateType,想改类型的时候只需要将int改为其他类型即可,一个是自己类型的指针,因为这样就可以通过一个指针,找到后面的全部的指针。

其次这里和之前一样我也是创建了三个项目:

一个SList.h存放函数声明以及头文件的包含,一个SList.cpp存放函数的定义,最后test.cpp是用来测试接口是否达到我想要的功能,另外,这里给大家解释一下为什么是.cpp,因为如果要用C++的语法后缀是要改成.cpp的而不是.c,但C++是包含C的语法的,所以我只会用到上面讲的引用的语法,其实均还是C来实现,这样以便大家能看懂。

 

1、动态申请一个节点

SListNode* BuySListNode(SLTDateType x)
{
	SListNode* newnode = (SListNode*)malloc(sizeof(SLis

你可能感兴趣的:(c语言,leetcode,算法,链表,数据结构)