手搓无头结点单链表存储英文字母表

本文介绍了如何用C语言实现一个存储英文字母表的无头结点单链表,包括创建、展示链表功能。作者在编写过程中遇到了指针初始化和malloc分配内存后未检查NULL的问题,通过添加判断解决了这些问题,提醒读者在处理指针和动态内存时要确保正确初始化和分配。
摘要由CSDN通过智能技术生成

手搓单链表存储英文字母表:

先上代码

#include<stdio.h>
#include<malloc.h>

typedef struct node {
	char letter;
	struct node* next;
}Node, * letter_table;

void build(letter_table l) {
	Node* p = l;
	for (int i = 1; i < 26; i++) {
		if (p) {
			p->letter = i + 'a' - 1;
			p->next = (Node*)malloc(sizeof(Node));
			p = p->next;
		}
	}
	p->letter = 'z';
	p->next = NULL;
}

void display(const letter_table l) {
	Node* p = l;
	while (p) {
		printf("%c ", p->letter);
		p = p->next;
	}
}

int main()
{
	letter_table l1 = (Node*)malloc(sizeof(Node));
	build(l1);
	display(l1);
	return 0;
}

这里代码很简单,只是实现了存储链表和展示链表内容两个小功能,其他的查找,插入,删除等功能不是重点所以我就不一一实现,感兴趣的读者可以自行扩展!


问题描述&&解决方案

哎呀!对于链表这东西的掌握,第一次还是在大一的时候哇,没想到随着年龄的增长,对于其越发的生疏啊,写个单链表的过程会考虑到许多问题,下面就当个个人记录吧,陈述一下自己在写无头结点单链表的时候的一些坎坷,大lao勿笑

  1. 创建链表的函数返回值选择

    个人在这里纠结了很久,喜欢考虑所有的情况然后选择一种自己倾向的方法实现,我犹豫的过程在网上查看了别的写法,大多数都是返回链表头指针的,然后函数形参也有二重指针的,我的思路是链表头指针我自己声明定义一个,然后根据这个头指针传到函数中,自行生成,殊不知这将为我后面带来一个头疼的bug!

  2. 指针初始化问题

    哈,这第二点就是我的在第一点所说的bug,就是在main函数中自行定义了一个头指针letter_table l1就完事了,后来发现传参的时候会显示不能使用未初始化的内存,emm,一想好像确实是指针得初始化之后才能使用,又去查了一下,果真如此。如下’

    定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。int a;p=&a;//将p指向变量a,此时p的指向是确定的当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。参考链接

  3. C6011:取消对NULL指针"__"的引用解决办法

    此警告表明正在取消引用空指针,如果指针的值无效,结果是未定义的
    ↑官方文档的解释
    意思就是malloc之后没有检查是不是空间不够返回了空指针NULL,所以在给结点赋值的时候加了个循环判断if(p),这小小的问题可花费我良久时间啊!虽然在运行过程中仅仅是一个警告不会出错,但是考虑了一下觉得还是有加上的必要,因为在用malloc动态分配内存的时候虽然一般来说不会出现分配失败的情况,但是如果用其申请了较大的动态数组,那就有寄了的可能,所以得判断是否分配成功!我这里使用的是c语言中的malloc函数,对于c++中的new也是同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

味堡o_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值