c语言:单链表的创建及操作(偏小白)

之前博主有说过会专门讲一期单链表的讲解。他来了😅

首先呢,嗯~我们大致说一下链表这个结构。

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

如下↓
在这里插入图片描述
(图片取自百度百科)
这里其实不必多说,很多小伙伴并不是难在这里。ok继续。

单链表的创建

很多小伙伴刚开始的时候就是会在这里犯浑,大部分是因为思路没有清楚。这里博主提供一个方法。
小伙伴们不要去直接对着书就是看,在脑海里面模仿一下这个过程,构建自己的代码,之后与书上进行对比,这个方法很有效,亲测
要博主来说的话,所谓链表,就是将一个一个小表格通过某种方式链接起来,我们创造这些表格并不难,其实就是利用上一篇博客所说的动态内存分配的函数。malloc或者calloc。这里我们用malloc。这里比较比较困难的小伙伴,建议打开编译器,跟着博主走。(为了一些比较萌新的小伙伴,这里博主会写的比较基础)

  1. 准备工作 : 我们将头文件,及结构体事先安排好。
    在这里插入图片描述
    这里注意,我们要使用的malloc函数之前已经说过在stdlib.h中,因此我们需要引入这个库。在结构体中,第二个单元我定义了一个指针,这个next指针实际是用来指向下一个单元的,这个指针我们可以称之为,至于这样的单元,每一个单元我们称之为节点。刚开始的单元,便称之为头结点,那么最后的单元,便是尾结点。ok,接下来我们创建链表。
    这里我们需要思路。我们将建立链表的过程卸载一个函数中,这样我们只需要调用这个函数即可。我们建立完这个链表之后要调用它,是不是得要一个指针?所以我们函数的返回值就要是一个结构体类型的指针
struct stu *creat()
{
}

那么,我们首先需要一个头吧,我们最后返回的那个指针一定也是指向这个头的吧!

struct stu *creat()
{
	struct stu *head=NULL;//这里我将头指针初始化,这其实并没有特别必要但是还是建议小伙伴们这样写。
	return head;
}

接下来,我们要考虑给它的后面延伸节点,并且,要让他们连接起来。因此,我们还需要额外的两个指针,至于为什么需要,小伙伴看下去,会明白的。

struct stu *creat()
{
	struct stu *p,*q;
	struct stu *head=NULL;
	p=q=(struct stu *)malloc(sizeof(struct stu));
	return head;
}

这里,我将这两个指针指向了了同样的空间,他们接下来需要完成给这些空间内的那个数据取值,并且将这些空间与head连接起来。而我们需要去思考就是连接的过程。

struct stu *creat()
{
	struct stu *head=NULL,*p,*q;
	p=q=(struct stu*)malloc(sizeof(struct stu));
	while(scanf("%d",&p->n)&&p->n!=0)
	{
		if(head==NULL)
			head=p;
		else
			q->next=p;
		q=p;
		p=(struct stu*)malloc(sizeof(struct stu));
	}
	q->next=NULL;
	return head;
}

很清楚,既然我们需要不断的赋值,同时我们需要给他一个停止的信息(即n=0时停止)。因此我们一定会用到循环结构。如果我们第一次赋值,这时候head还是指向空的,那么我们便让head指向p的空间,这样head本身也会含有一个数据,之后我们使用p和
q的交替,来不断的为它延伸整个表的长度,每一次都给p开辟空间,给p赋值,在将q的next指向p使他们连接起来,然后又将q指向p,开始开辟下一片空间,往复循环。这样一个单链表就会创建完毕。一定要注意啊,这里的q和p并不是固定的一个空间,而是指针,因此我们才能不断通过对q和p的操作,完成对head连接空间,这里还有不清楚的小伙伴需要好好想一想,不能再说的浅了😂

输出链表

之前链表已经创建完毕,既然创建那我们一定要用,输出链表是对读取链表数据最简单的应用之一。
代码:

void print(struct stu *head)
{
	struct stu *p=head;
	while(p!=NULL)
	{
		printf("%d\n",p->n);
		p=p->next;
	}	
}

这些函数,我们写进主函数即可实现。由于是比较基础的,所以代码可以改进的地方很多很多,小伙伴们随着学习的深入可以改出很简洁的代码。例如这块的输出,其实可以有很多其他写法,但总体思路都是不变的,

void print(struct stu *head)
{
	struct stu *p=head;
	do
		printf("%d\n",p->n);
	while(p=p->next);	
}

很明显上面这种更加赏心悦目。(我们要讲究一个美观😠)

void print(struct stu *head)
{
	struct stu *p=head;
	while(p)
	{
		printf("%d\n",p->n);
		p=p->next;
	}	
}

接下来是关于,删除,添加的操作。当然,博主希望小伙伴们现将这最基本的吃透。至于接下来的操作,我全部放在了,该网页。
传送门←←
这里会由于已经涉及到了数据结构与算法,所以,会看起来比较复杂,但是其实并不难,小伙伴们仔细钻研即可,其思想都蕴藏在代码中!

ok 今天就到这里了。晚安😄

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值