链表入门小练习
题目
定义一个结构体 contact 联系人,两个字段:姓名和手机号使用结构体做数据域,实现 list, link 两个实例。
typedef struct node{
联系人 data;// 数据域
struct node *next;
}Node;
一、题目解析
需求目标:
- 定义包含姓名和手机号的联系人结构体
contact
- 基于该结构体构建链表节点
node
,包含数据域和指针域 - 创建两个链表节点实例
list
和link
技术重点:
- 结构体的嵌套使用
- 链表节点的指针操作
typedef
简化类型声明
二、分步实现与讲解
1. 定义联系人结构体
typedef struct contact {
char name[20]; // 存储姓名(最长19字符+结束符)
char phone[15]; // 存储手机号(如+86 13812345678)
} Contact;
typedef
作用:将struct contact
重命名为Contact
,后续可直接用Contact
声明变量。- 字段设计:
name[20]
:限制姓名长度,防止内存溢出phone[15]
:兼容国际号码格式
2. 定义链表节点结构体
typedef struct node {
Contact data; // 数据域:存放联系人信息
struct node *next; // 指针域:指向下一个节点
} Node;
- 结构体嵌套:
Node
包含Contact
类型的成员,实现数据封装。 - 自引用指针:
struct node *next
允许每个节点指向同类型的下一个节点,形成链式结构。
3. 创建链表实例
// 创建两个节点
Node list;
Node link;
- 内存分配:此时
list
和link
是静态分配的节点,存储在栈内存中。 - 指针初始化:默认情况下
next
指针未赋值,通常应初始化为NULL
避免野指针。
三、关键代码解析
1. 结构体定义中的typedef
技巧
原始结构体声明方式:
struct contact {
// ...字段...
};
struct contact person; // 每次使用时需带struct关键字
使用typedef
优化后:
typedef struct contact {
// ...字段...
} Contact;
Contact person; // 直接使用简化名称
2. 链表节点的指针操作
next
指针的意义:
每个节点的next
存储下一个节点的内存地址,形成“链式”访问路径。- 结束标识:通常链表的最后一个节点的
next
置为NULL
,表示终止。
四、完整代码实现
#include <stdio.h>
#include <string.h>
// 定义联系人结构体
typedef struct contact {
char name[20];
char phone[15];
} Contact;
// 定义链表节点
typedef struct node {
Contact data;
struct node *next;
} Node;
int main() {
// 创建两个节点并初始化
Node list = { .data = {"Alice", "123-4567-8901"}, .next = NULL };
Node link = { .data = {"Bob", "198-7654-3210"}, .next = &list };
// 遍历链表打印信息
Node *current = &link;
while (current != NULL) {
printf("Name: %-10s Phone: %s\n",
current->data.name,
current->data.phone);
current = current->next;
}
return 0;
}
代码说明:
-
初始化节点:
list
节点存储Alice的信息,next
指向NULL
link
节点存储Bob的信息,next
指向list
,形成链表:link → list
-
遍历链表:
- 通过
current
指针依次访问每个节点,直到遇到NULL
终止 ->
操作符用于通过指针访问结构体成员
- 通过
运行结果:
Name: Bob Phone: 198-7654-3210
Name: Alice Phone: 123-4567-8901
五、扩展思考
-
动态内存分配
实际开发中常用malloc
动态创建节点,灵活管理内存:Node *node = (Node*)malloc(sizeof(Node)); // 使用后需手动释放 free(node);
-
链表操作
- 插入节点:修改相邻节点的
next
指针 - 删除节点:调整指针后释放内存
- 查找节点:遍历链表比对数据
- 插入节点:修改相邻节点的
结语
通过本案例,我们学习了结构体和链表的基础应用。掌握这些知识点后,可进一步实现通讯录管理系统等复杂项目。理解指针操作和内存管理是深入C语言的关键,建议通过实践巩固这些概念。