一起笨笨的学C ——16链表基础

目录

       

目录

前言

正文

链表定义:

基本创建链表程序:

链表结点插入:

 对角线记忆法:

画图理解法:

链表结点删除:

链表销毁:

  后语



前言

        链表理解方法分享,愿你的大脑也能建立一个链表的指针!


正文

链表定义:

为什么要熟悉定义,总感觉对理解链表会有帮助的。
链表是什么?链表是C 高级编程核心。高级编程诶,开不开心!

链表是相对数组而言的,之所以需要链表是因为数组有缺点。

对于链表而言,最要命的其实不是庞大的代码量,而是逻辑。(就像接电路一样,搞不懂逻辑,看别人继电器之间互锁自锁,就像给自己大脑上了一把锁)

链表是N个结点离散分配,彼此通过指针相连,除头结点与尾结点外,中间的每个结点只有一个前去结点和一个后续结点, 头结点没有前驱结点,尾结点没有后续结点。

一堆鬼文字只能辅助理解(大部分摘自《手把手教你C语言》)。

基本创建链表程序:

就像当初学编程从输出“hello,world”一样,理解创建链表的过程很重要,是基础中的基础,这个搞定后,后面的一系列删除、插入等就不是问题了(的确没那么难理解了)。

//#define NDEBUG

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

#include "dbg.h"

typedef struct node{
	
	char *data;
	struct node  *next;
}Sn;//结构体类型通常首字母大写。
Sn *create_list(void); 
void print(Sn *list);

int main(int argc, char *argv[])
{
	Sn *list;
	list = create_list();
	print(list);

	while(list !=NULL){
		Sn *tmp = list;
		list = list->next;
		free(tmp);
	}

	return 0;
}

Sn *create_list(void)
{
	int i;
	int num;
	Sn *head = malloc(sizeof(*head));
	Sn *move = head; //这是head的秘书
		debug("%p", move);
	check_mem(head);
	printf("你想输入几条数据?\n:");
	scanf("%d", &num);
	getchar();

	for (i=0; i<num; i++){
		Sn *fresh= malloc(sizeof(*fresh));
	    char *tmp = malloc(sizeof(tmp));
		check_mem(fresh);
		printf("请输入第%d条数据", i+1);
		scanf("%s", tmp);
		getchar();

		fresh->data = tmp;
		fresh->next = NULL;
		move->next = fresh;
		move = fresh;
		debug("%p", move);
	}

return head;
error:
	exit(-1);
}

void print(Sn *list)
{
	Sn *move = list;
		debug("%p", move);
	printf("你输入的数据是:");
	while(move->next !=NULL){
		printf("%s", move->next->data);
		move= move->next;
		debug("%p", move);
	}
	printf("\n");
}

链表结点插入:

 对角线记忆法:

对角线大家都知道,怎么结合程序理解记忆呢?如

fresh->next = move->next;
move->next = fresh
画图理解法:

如果以上感觉还是不理解,脑袋里绕不过来,那就拿笔在纸上画画。

如图,假设原来只有move及move->next两块内存,现在要插入fresh,那么就要先让fresh的next指针指向fmovenext,然后movenext指向fresh。顺序不要错,不然报错为定义。

        其实搞懂链表创建之后,其它的理解起来也就没那么难了,再看下删除吧。

链表结点删除:

void delete(Sn *head)
184 {
185     char num[20] = "\0";
186     printf("Select the num to delete: ");
187     Sn *save = malloc(sizeof(*save));
188     Sn *move = head;
189     scanf("%s", num);
190     while(move->next != NULL){
191         if(strcmp(num, move->next->num)== 0){
192             save = move->next;
193             move->next =  move->next->next;
194             free(save);
195             save = NULL;
196         }
197         move = move->next;
198     }
199     printf("dielet it!");
200    }
201//间隔一段时间再看,我又用笔画了画才理解,也许我该放弃了?

链表销毁:

         

while(head != NULL){
    save = head->next;
    free(head);
    head = save;
}

    所以你废了吗?


  后语

  1. 本以为我已经已如道,可以闭关修炼了。结果在即将道基崩塌的一刻,幡然醒悟,我已再次入魔!浮躁不知不觉又侵占吾身,特开此篇,抑制心魔,与尔共勉!——20240702

  2. 修真小说看多了,大脑总喜欢把C语言与 修真联想。以下是部分狂想曲:链表是金丹之锁,打破它,才能成为高手。指针之前是寻找气感,理解指针进入练气,然后经过later……以后,锁链出现了。

    哦,掌握它得的过程就是破丹期!打破了才是新生,打不破就是个蛋!

  3. 一不小心已经过去了一个月了,尽管有别的事情,但是更多的说明链表不愧是高级部分,自学表示真的很难——2024/7/27

      4.手把手的吴明杰说,实在搞不懂就记住吧  。我正在用这个方法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值