手搓单链表存储英文字母表:
先上代码
#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勿笑
-
创建链表的函数返回值选择
个人在这里纠结了很久,喜欢考虑所有的情况然后选择一种自己倾向的方法实现,我犹豫的过程在网上查看了别的写法,大多数都是返回链表头指针的,然后函数形参也有二重指针的,我的思路是链表头指针我自己声明定义一个,然后根据这个头指针传到函数中,自行生成,殊不知这将为我后面带来一个头疼的bug!
-
指针初始化问题
哈,这第二点就是我的在第一点所说的bug,就是在
main
函数中自行定义了一个头指针letter_table l1
就完事了,后来发现传参的时候会显示不能使用未初始化的内存,emm,一想好像确实是指针得初始化之后才能使用,又去查了一下,果真如此。如下’定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。int a;p=&a;//将p指向变量a,此时p的指向是确定的当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。
参考链接 -
C6011:取消对NULL指针"__"的引用解决办法
此警告表明正在取消引用空指针,如果指针的值无效,结果是未定义的
↑官方文档的解释
意思就是malloc之后没有检查是不是空间不够返回了空指针NULL
,所以在给结点赋值的时候加了个循环判断if(p)
,这小小的问题可花费我良久时间啊!虽然在运行过程中仅仅是一个警告不会出错,但是考虑了一下觉得还是有加上的必要,因为在用malloc
动态分配内存的时候虽然一般来说不会出现分配失败的情况,但是如果用其申请了较大的动态数组,那就有寄了的可能,所以得判断是否分配成功!我这里使用的是c语言中的malloc
函数,对于c++中的new
也是同理。