为什么结构指针的值错误 和使用2个函数的main版本测试程序链接列表结构

如何解决为什么结构指针的值错误 和使用2个函数的main版本测试程序链接列表结构

因此,我开始研究C语言中的数据结构,并希望编写一个单链表。

这只是其中的一小部分:

struct nodes {
    int val;
    struct nodes *next;
};

void insert(struct nodes *list,int val) {
    struct nodes *tmp = (struct nodes*) malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    list = tmp;
}

int main() {
    struct nodes *test;
    insert(test,5);
    insert(test,10);

    printf("test %d\n",test->next->val);
}

这里我得到完全错误的输出。当我尝试编写不需要传递结构指针的函数时,它的工作原理与预期的一样。

输出:

test 90053

P.S我仍然从C开始,所以不要太刻苦:D

解决方法

您正在更改局部变量,因此对调用方没有影响。您可能的意思是使用指向指针的指针,以便可以对其进行更改:

var url = `Mysite:3000/from/here/${othervars}?orgId=1&refresh=30s`

现在的功能如下:

int main() {
    struct nodes *test = NULL; // Don't forget to initialize
    insert(&test,5);
    insert(&test,10);

    printf("test %d\n",test->next->val);
}

由于void insert(struct nodes **list,int val) { struct nodes *tmp = malloc(sizeof(struct nodes)); // No need to cast malloc() in C tmp->val = val; tmp->next = *list; *list = tmp; } 被取消引用(list),因此实际上更改了原始值(指向),这意味着列表头发生了更改。

在您的原始代码中,您从未初始化过*list,这只是一些随机的垃圾值,并且由于list永远无法更改它,因此它仍然是垃圾数据。通过这种方式访问​​任何数据都是未定义的行为,因此您将得到垃圾数据或崩溃。

,

您可以这样:

    struct nodes {
    int val;
    struct nodes* next;
};

nodes* insert(struct nodes* list,int val) {
    struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    return tmp;
}

在尝试编写类似第一个函数的结构时,我相信---是list()而不是insert()。

在每个可以更改列表起始地址的功能中,您必须返回地址,否则它将丢失。而且由于您仅在开始处插入,所以丢失了所有内容,因为开始地址始终会更改。 通常不要使用void。至少是浪费,通常是一个错误。返回一些信息,例如完成状态。查看list()的实现,该实现返回... size

int         list(struct nodes* list)
{
    struct nodes* p = list;
    int N = 0;
    while (p != NULL)
    {
        printf("#%d  %d\n",N,p->val);
        p = p->next; N += 1;
    };
    printf("\n");
    return N;
}

和使用2个函数的main()版本

int main() {
    struct nodes* test = NULL;
    int n = 0;
    for(n = 800; n>0; n-= 100) test = insert(test,n);
    n = list(test);
    printf("At the end list() returned %d\n",n);
}

这样,您可以从一开始就获得更多信息。

#0  100
#1  200
#2  300
#3  400
#4  500
#5  600
#6  700
#7  800

At the end list() returned 8

测试程序

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

struct no
{
    void*       item;
    struct no*  next;
    struct no*  prev;
};  // no
typedef struct no Node;

typedef struct
{
    char* name;
    unsigned  size;
    unsigned  limit;
    Node* start;
    Node* end;
}   List;

struct nodes {
    int val;
    struct nodes* next;
};

struct nodes*   insert(struct nodes*,int);
int             list(struct nodes* L);

int main() {
    struct nodes* test = NULL;
    int n = 0;
    for(n = 800; n>0; n-= 100) test = insert(test,n);
}

struct nodes*   insert(struct nodes* list,int val) {
    struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    return tmp;
}

int         list(struct nodes* list)
{
    struct nodes* p = list;
    int N = 0;
    while (p != NULL)
    {
        printf("#%d  %d\n",p->val);
        p = p->next; N += 1;
    };
    printf("\n");
    return N;
}

如评论中所指出,请注意,列表不是node。节点集合的列表,并且节点具有数据有效负载。如果有效载荷是(void*),那么您将拥有一个真正的抽象数据结构,因为它可以加载任何内容,从单个char100-fields structure

考虑一下编写方式以及程序中有5个列表的情况:一团糟,它将变得非常快。并与下面的代码进行比较

链接列表结构

struct no
{
    void*       item;
    struct no*  next;
    struct no*  prev;
};  // no
typedef struct no Node;

typedef struct
{
    char* name;
    unsigned  size;
    unsigned  limit;
    Node* start;
    Node* end;
}   List;

请注意,随着您在List中添加更多信息,事情变得更加容易:您始终拥有大小,限制,开始和结束的指针等等

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res