心得汇总
一、线性表的定义和基本操作
二、线性表的顺序表示
三、线性表的链式表示
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*
主函数逻辑:
- 创建第一个节点 (p):
- 分配内存空间
- 设置
data = 100
- 设置
next = NULL
(作为链表尾节点)
- 创建第二个节点 (q):
- 分配内存空间
- 设置
data = 50
- 设置
next = p
(指向第一个节点)
- 打印地址和值:
- 显示指针变量
p
和q
的内存地址 - 显示它们所存储的值(即所指向节点的地址)
- 显示指针变量
- 遍历链表:
- 从
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;
}
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客