第二章 线性表 代码实现

心得汇总

一、线性表的定义和基本操作

二、线性表的顺序表示

三、线性表的链式表示

3.1 链表结点定义

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

typedef int ElemType;

typedef struct LNode {
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

int main()
{
	LNode* p = (LNode*)malloc(sizeof(LNode));
	p->data = 100;
	p->next = NULL;

	LNode* q = (LNode*)malloc(sizeof(LNode));
	q->data = 50;
	q->next = p;

	printf("p的地址为%8llu, p的内容为%8d\n", (unsigned long long) & p, p);
	printf("q的地址为%8llu, q的内容为%8d\n", (unsigned long long) & q, q);

	while (q != NULL)
	{
		printf("data = %5d next = %llu\n", q->data, (unsigned long long)q->next);
		q = q->next;
	}

	return 0;
}

这个C程序演示了一个简单的链表实现,包含两个节点。让我来分析一下它的功能:

代码分析

结构体定义:

  • 定义了链表节点结构体 LNode,包含整型数据域 data 和指向下一个节点的指针 next
  • 创建了类型别名 LinkList 表示 LNode*

主函数逻辑:

  1. 创建第一个节点 (p):
    • 分配内存空间
    • 设置 data = 100
    • 设置 next = NULL(作为链表尾节点)
  2. 创建第二个节点 (q):
    • 分配内存空间
    • 设置 data = 50
    • 设置 next = p(指向第一个节点)
  3. 打印地址和值:
    • 显示指针变量 pq 的内存地址
    • 显示它们所存储的值(即所指向节点的地址)
  4. 遍历链表:
    • q 开始,沿着 next 指针遍历
    • 打印每个节点的数据和下一个节点的地址

预期输出结构

程序会输出类似这样的内容:

p的地址为xxxxxxxx, p的内容为yyyyyyyy
q的地址为xxxxxxxx, q的内容为zzzzzzzz
data =    50 next = yyyyyyyy
data =   100 next = 0

关键要点

  • 链表结构为:q (data=50) → p (data=100) → NULL
  • 程序演示了指针地址(&p, &q)与指针值(p, q)的区别
  • 分配了内存但没有释放(此例中存在内存泄漏)
  • 遍历正确地从 q 到 p 再到 NULL

这是一个展示C语言中链表节点创建、连接和遍历的基础示例。

优化后的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>  // 使用标准的stdlib.h替代malloc.h

typedef int ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode* next;
} LNode, *LinkList;

int main()
{
    LNode* p = (LNode*)malloc(sizeof(LNode));
    if (p == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    p->data = 100;
    p->next = NULL;

    LNode* q = (LNode*)malloc(sizeof(LNode));
    if (q == NULL) {
        printf("内存分配失败\n");
        free(p);  // 释放之前分配的内存
        return 1;
    }
    q->data = 50;
    q->next = p;

    // 正确打印指针地址
    printf("p的地址为%p, p的内容为%p\n", (void*)&p, (void*)p);
    printf("q的地址为%p, q的内容为%p\n", (void*)&q, (void*)q);

    // 使用临时指针遍历链表,保留头指针
    LNode* current = q;
    while (current != NULL) {
        printf("data = %5d next = %p\n", current->data, (void*)current->next);
        current = current->next;
    }

    // 释放内存
    free(p);
    free(q);

    return 0;
}

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(0)
何大锤的头像何大锤管理团队

相关推荐

  • 第二章 线性表考点

    【考频统计】 年份 考点 分值 2009 双指针问题(前后指针):查找单链表中倒数第 k 个结点 15分 2010 数组循环左移(数组逆置问题) 13分 2011 寻找两个数组的中位数 15分 2012 相交链表找交点 15分 2013 将两个升序链表合并为一条降序链表(选择)、数组主元素(摩尔投票法) 应用题线性表的顺序存储结构与链式存储结构的ASL问题 …

    2025年7月9日
    200
  • 第二章 线性表 手写笔记

    一、线性表的定义和基本操作 二、线性表的顺序表示 2.1 顺序表的定义 2.2 顺序表的初始化 2.3 插入操作 2.4 删除操作 2.5 按值查找 三、线性表的链式表示 3.1 链表的定义 3.2 链表结点创建 逻辑结构图1 逻辑结构图2

    2025年7月5日
    200
  • 第二章 习题集

    一、重要知识点 1、仅有尾指针的单循环链表 优于仅有头指针的单循环链表,有尾指针相当于也提供了头指针 2、在单链表某结点前插入结点,只知道当前节点是无法实现的 3、只知道当前节点,也可以删除该节点,把后面的元素的值复制到当前,例如3.14 4、如果是链表,线性表的第 i 个元素时间与 i 的大小有关;如果是顺序表则是随机存储。 5、静态链表与动态链表相比的缺…

    2025年7月4日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......