删除C中链表中每个奇数位置的节点

2023-12-21

我试图在 C 中创建一个函数来删除每个奇数位置的节点。例如1,2,3,4变成2,4.

这是我尝试过的,但似乎不起作用。 我正在谈论的是deletee功能。我修改了它,但列表似乎没有改变。

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int val;
    struct node *next;
} node;

typedef struct ll {
    node *head;
} ll;

ll *newll() {
    ll *k = malloc(sizeof(ll));
    k->head = NULL;
    return k;
}

void insert(ll *l, int vl) {
    node *tmp = malloc(sizeof(node));
    tmp->next = NULL;
    tmp->val = vl;
    if (l->head == NULL) {
        l->head = tmp;
        return;
    }
    node *s = l->head;
    while (s->next != NULL)
        s = s->next;
    s->next = tmp;
}

void printll(ll *l) {
    node *s = l->head;
    while (s != NULL) {
        printf("%d ", s->val);
        s = s->next;
    }
}

void deletee(ll *l) {
    node *k = l->head;
    while (k != NULL && k->next != NULL) {
        node *tmp = k->next->next;
        k = tmp;
    }
}

int main() {
    ll *ll1 = newll();
    insert(ll1, 5);
    insert(ll1, 6);
    insert(ll1, 8);
    insert(ll1, 9);
    insert(ll1, 10);
    insert(ll1, 11);
    deletee(ll1);
    printll(ll1);
    return 0;
}

我们需要更新两者ll.head and node.next,所以指向node除非你想对头部进行特殊处理,否则还不够好。相反,让我们使用指向我们要更新的指针的指针。

void delete_node(node** node_ptr_ptr) {
   node* to_delete = *node_ptr_ptr;
   *node_ptr_ptr = to_delete->next;
   free(to_delete);
}

void delete_every_second(ll* l) {
   node** node_ptr_ptr = &( l->head );
   while (1) {
      if (*node_ptr_ptr == NULL) break;
      delete_node(node_ptr_ptr);
      if (*node_ptr_ptr == NULL) break;
      node_ptr_ptr = &( (*node_ptr_ptr)->next );
   }
}

假设您从以下内容开始:

+------+      +------+      +------+      +------+
| head ------>| val  |  +-->| val  |  +-->| val  |
+------+      +------+  |   +------+  |   +------+
              | next ---+   | next ---+   | next --->NULL
              +------+      +------+      +------+

After node** node_ptr_ptr = &( l->head );:

+------+      +------+      +------+      +------+
| head ------>| val1 |  +-->| val2 |  +-->| val3 |
+------+      +------+  |   +------+  |   +------+
    ^         | next ---+   | next ---+   | next --->NULL
    |         +------+      +------+      +------+
    |
    +-----+
          |
+------+  |
| ptr ----+
+------+

After node* to_delete = *node_ptr_ptr;:

              +------+
              | del ----+
              +------+  |
                        |
                 +------+
                 |
                 v
+------+      +------+      +------+      +------+
| head ------>| val1 |  +-->| val2 |  +-->| val3 |
+------+      +------+  |   +------+  |   +------+
    ^         | next ---+   | next ---+   | next --->NULL
    |         +------+      +------+      +------+
    |
    +-----+
          |
+------+  |
| ptr ----+
+------+

After *node_ptr_ptr = to_delete->next; free(to_delete);:

+------+                    +------+      +------+
| head -------------------->| val2 |  +-->| val3 |
+------+                    +------+  |   +------+
    ^                       | next ---+   | next --->NULL
    |                       +------+      +------+
    |      
    +-----+
          |
+------+  |
| ptr ----+
+------+

After node_ptr_ptr = &( (*node_ptr_ptr)->next );:

+------+                    +------+      +------+
| head -------------------->| val2 |  +-->| val3 |
+------+                    +------+  |   +------+
          +---------------->| next ---+   | next --->NULL
          |                 +------+      +------+
          |
+------+  |
| ptr ----+
+------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除C中链表中每个奇数位置的节点 的相关文章

随机推荐

  • 是否自定义会员资格

    我正在 ASP NET MVC3 中创建网站 足球 足球 我希望拥有用户 具有默认会员资格的用户的附加信息 这些是普通访问者 和玩家 我认为最好他们继承用户并拥有一些附加信息如衣号 玩家还可以发布文章 用户可以只评论文章 做到这一点的最佳方
  • 过滤堆叠元素的多个放置处理程序中断

    我有一些 div 设置为 droppable 的元素可以接收从图库中拖放到其上的缩略图 img 元素也被设置为接受这些缩略图 因此我可以在图像之上添加图像 放置处理程序从缩略图中恢复图像并将其附加到正文中 当多个 div 和 imgs 堆叠
  • MUI 自动完成(多个)控制值 - 神秘的输入行为

    我正在尝试编写代码以在键盘输入时异步搜索多选组合 然而我在最新版本 5 2 2 中发现了一个我无法解释的奇怪行为 我提炼出以下问题 基于 MUI 自动完成页面的示例 import as React from react import Tex
  • 与父实体一起逐出依赖集合

    我刚刚意识到 当一个对象从 Hibernate 缓存中被逐出时 依赖集合 如果被缓存 必须被驱逐分别地 http jaitechwriteups blogspot com 2006 08 evict collection from hibe
  • 如何使用 c#.net 读取 XML 中的 XML 节点

    我有一个如下所示的 XML 文件
  • Vaadin Valo 页面不会滚动

    我正在基于原生 Valo 主题创建一个新的 Vaadin 主题 升级到 Vaadin 7 3 Valo 由其他人完成 后 页面内容将不再滚动 除了整个页面本身之外 页面上应用了溢出属性的所有其他元素都可以正常工作 我知道我可以应用这个 v
  • Netlogo的执行顺序是怎样的?

    请问我这句话正确吗 如果我写 ask turtles go forward go backward 随机一只乌龟向前移动然后向后移动 然后第二只随机乌龟会做同样的事情 依此类推 这是否正确 相对于 ask turtles go forwar
  • 如何在 Firefox 中使用 php curl 发送推送消息

    我已经为 Chrome 实现了推送通知 当我需要向 GCM 发送推送消息时 我使用了以下 PHP 函数 function send push message subscription ids Set GCM endpoint url htt
  • C# .NET 支持 IDispatch 后期绑定吗?

    问题 我的问题是 C 本身支持后期绑定 IDispatch 吗 Pretend我正在尝试自动化 Office 同时与客户安装的任何版本兼容 在 NET 世界中 如果您在安装了 Office 2000 的情况下进行开发 则从现在到世界末日 每
  • 如何在 Gradle 构建中使用为 jar 文件提供的范围?

    我需要在我的应用程序中使用 Amazon Maps 和 Amazon Messaging 使用 gradle 我没有成功添加具有 提供 范围的 Amazon 依赖项正如他们需要的那样 https developer amazon com s
  • Swift 与泛型类型的条件一致性

    我正在尝试使用两种通用类型来使用 Swift 扩展 我试着举个例子 我们有一个盒子 可以容纳不同类型的物品 class Box
  • 求和间隔

    我必须对这样的间隔进行求和 1 6 2 4 The result is 1 6 so there are 6 numbers in the end 这是另一个例子 4 6 8 10 14 16 4 5 6 8 9 10 14 15 16 t
  • Docker 最佳实践:容器的单一进程

    码头工人最佳实践 https docs docker com engine articles dockerfile best practices 指南指出 您应该只在单个容器中运行单个进程 Nginx 和 PHP FPM 应该在单独的容器中
  • 使用 CString 进行 PInvoke

    我正在尝试使用 P Invoke 从 C 调用非托管 C DLL 中的函数 C DLL 使用CString 作为函数参数和返回值 例如 CString AFX EXT API GetUserName CString userID 不幸的是
  • 在初始化中省略重要的复制/移动构造函数是否合法?

    鉴于此应用程序 include
  • Python查找所有出现的连字符单词并替换该位置

    我必须用连字符替换所有出现的模式c c c c come or oh oh oh oh等与最后一个标记即come or oh在此示例中 其中 连字符之间的字符数是任意的 可以是一个或多个字符 要匹配的标记是连字符中的最后一个标记 因此com
  • 在 Dart/Flutter 中反序列化 json 数组

    如何反序列化这个json数组 i 737 n 1 得到变量 i e n 要反序列化的类 class PortasAbertas int i int n PortasAbertas this i this n PortasAbertas fr
  • 不建议在 ES6 中使用“use strict”?

    我还不熟悉 ECMAScript 6 我刚刚克隆了 React Starter Kit 存储库 它使用 ES6 作为应用程序代码 我很惊讶地发现 linter 是配置好的 https github com kriasoft react st
  • 在指令之间共享数据

    我有一些数据称为foo它所在的范围是三个孩子的父级 div div
  • 删除C中链表中每个奇数位置的节点

    我试图在 C 中创建一个函数来删除每个奇数位置的节点 例如1 2 3 4变成2 4 这是我尝试过的 但似乎不起作用 我正在谈论的是deletee功能 我修改了它 但列表似乎没有改变 include