408王道数据结构课后代码习题(廿一)

简介: 408王道数据结构课后代码习题(廿一)

24


image.png


  • 首先给出单链表结点的数据类型定义:


typedef struct LNode{
  int data;
  struct LNode* link;
}LNode, *LinkList; 
复制代码


  • 一眼桶排,之前做过很多次这样的题,其实就是用一个辅助数组记录出现过的结点值
  • 其实就是把出现的结点值看作数组下标,如果需要记录次数则数组元素代表出现次数
  • 第一个数为21,则令辅助数组 arr[21]=1 即可
  • 因为 |data| <= n,只需要保存绝对值,所以申请一个大小为 n+1 的辅助数组就可以了
  • 我们可以一边遍历,一边判断结点元素值的绝对值是否是第一次出现,不是则删除该结点
  • 典型的拿空间换时间,时间复杂度O(m),空间复杂度O(n)


void delSameAbsoluteValue(LinkList L, int n) {
  // 1.初始化辅助数组
  int arr[n+1] = {0};
  LNode *p = L, *del;
  // 2.遍历同时判别
  while (p->link != NULL) {
    int m = abs(p->link->data);   // 获得绝对值
    if (arr[m] == 0) {
      arr[m] = 1;       // 首次出现
      p = p->link;
    } else {
      del = p->link;    // 非首次出现直接删除
      p->link = del->link;
      free(del);
    }
  }
复制代码


  • 有一点需要说明一下
  • 408考试的时候,好像是不允许 int arr[n+1] = {0} 这种语法的
  • 所以我们需要用 malloc() 来创建数组,然后使用循环或者 memset() 将数组元素初始值置为0
  • 注意 memset() 只能将int数组初始化为0或-1


int arr[n+1] = {0};
// 推荐方法
int *arr = (int *)malloc(sizeof(int) * (n+1));
for (int i = 0; i < n+1; i++) {
  *(arr+i) = 0;
}
int *arr = (int *)malloc(sizeof(int) * (n+1));
memset(arr, 0, sizeof(int) * (n+1));
int arr[n+1];
memset(arr, 0, sizeof(arr));


目录
相关文章
|
2天前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
2天前
|
存储 编译器 C语言
【数据结构】C语言实现链队列(附完整运行代码)
【数据结构】C语言实现链队列(附完整运行代码)
43 0
|
2天前
|
存储 编译器 C语言
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
11 0
|
2天前
|
存储 算法 分布式数据库
数据结构第五课 -----二叉树的代码实现
数据结构第五课 -----二叉树的代码实现
|
2天前
|
存储
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
|
2天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
2天前
|
算法 调度 C++
[数据结构与算法]贪心算法(原理+代码)
[数据结构与算法]贪心算法(原理+代码)
|
2天前
|
存储 算法 编译器
【数据结构】C语言实现链式二叉树(附完整运行代码)
【数据结构】C语言实现链式二叉树(附完整运行代码)
38 1
|
2天前
|
存储 程序员 编译器
【数据结构】C语言实现堆(附完整运行代码)
【数据结构】C语言实现堆(附完整运行代码)
31 0
|
2天前
|
存储 编译器 C语言
【数据结构】C语言实现顺序栈(附完整运行代码)
【数据结构】C语言实现顺序栈(附完整运行代码)
37 0