链表小作业

链表入门小练习

题目

定义一个结构体 contact 联系人,两个字段:姓名和手机号使用结构体做数据域,实现 list, link 两个实例。
typedef struct node{
联系人 data;// 数据域
struct node *next;
}Node;


一、题目解析

需求目标:

  1. 定义包含姓名和手机号的联系人结构体contact
  2. 基于该结构体构建链表节点node,包含数据域和指针域
  3. 创建两个链表节点实例listlink

技术重点:

  • 结构体的嵌套使用
  • 链表节点的指针操作
  • 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;
  • 内存分配:此时listlink是静态分配的节点,存储在栈内存中。
  • 指针初始化:默认情况下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;
}

代码说明:

  1. 初始化节点

    • list节点存储Alice的信息,next指向NULL
    • link节点存储Bob的信息,next指向list,形成链表:link → list
  2. 遍历链表

    • 通过current指针依次访问每个节点,直到遇到NULL终止
    • ->操作符用于通过指针访问结构体成员

运行结果:

Name: Bob        Phone: 198-7654-3210
Name: Alice      Phone: 123-4567-8901

五、扩展思考

  1. 动态内存分配
    实际开发中常用malloc动态创建节点,灵活管理内存:

    Node *node = (Node*)malloc(sizeof(Node));
    // 使用后需手动释放
    free(node);
    
  2. 链表操作

    • 插入节点:修改相邻节点的next指针
    • 删除节点:调整指针后释放内存
    • 查找节点:遍历链表比对数据

结语

通过本案例,我们学习了结构体和链表的基础应用。掌握这些知识点后,可进一步实现通讯录管理系统等复杂项目。理解指针操作和内存管理是深入C语言的关键,建议通过实践巩固这些概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值