题解 | #牛牛的单向链表#

头插法比较简单,但头插法会把最新的放第一个,所以再申请一个数组换位。
头插法讲解: 声明一个头指针data(技巧:命名可名为lianbiao),一个新结构体指针temp用来存储输入的值。
先判断头指针是否为空。若为空,将头指针的值改为结构体指针的值,data.next(下一个指针)值为空。
否则 将新结构体指针temp的下一个指针改为头指针的值,然后头指针改为新结构体指针的值。
迭代的实现方式:此链表有个特点。只有尾巴是NULL,所以用while循坏,用指针!=NULL作为条件。
最后将头指针改为头指针的下一个指针data.next的方式实现迭代。
malloc申请的必要:malloc在不知节点个数的情况是必须申请动态内存的!
        首先内存在栈里很容易被覆盖,在堆里就可避免重复使用,而且栈内存只分配一次。我的思路是在循坏里添加节点,但即使循坏,栈也只分配一次。
假设有四个节点,没用malloc时,你的四个(结构体)节点都会覆盖在同一个节点上。所以打印时只会打印最后一个,还有种可能,调试时发现Programm received signal SIGSEGV, Segmentation fault,有可能是指针访问到未分配的内存的提示。,说明声明指针变量时是没有开辟一个结构体大小的内存。

用malloc时,你的四个节点在堆里都存在,会分开而不是覆盖。所以能连起来。
我也是新手,欢迎各位大佬指正!" src="https://uploadfiles.nowcoder.com/images/20220815/318889480_1660553876543/8526E2CCE5A1270D1D3A9550826C140A" />

# include<stdio.h>
# include<string.h>
# include <stdlib.h>
struct  math{
    int x;
    struct math *next;
};
int main()
{
    int y;
    scanf("%d",&y);
    int a[y];
    int b[y];
    
    for(int i=0;i<y;i++) //把数列倒序
    {
        scanf("%d",&a[i]);
}
    for(int i=0;i<y;i++)
    {
        b[i]=a[y-1-i];
        //printf("%d",b[i]);
    }
    
    struct math *data=NULL;
    for(int i=0;i<y;i++)
    {
        
         struct math *temp;
         //struct math *temp=(struct math *)malloc(sizeof(struct math)) ;
        temp->x=b[i];
        temp->next=NULL;
     if(data==NULL) 
     {
         data=temp;
         temp->next=NULL;
     }
    else
        {
            temp->next=data;
            data=temp;
        }
    }
    while(data!=NULL)
    {
       
        printf("%d ",data->x);
        data=data->next;
    }
    return 0;
    
}

全部评论
好细节的博主,爱了爱了
点赞 回复 分享
发布于 2022-08-26 11:49 四川

相关推荐

不是哥们,我投的开发岗啊,也不至于直接调剂销售岗吧
哞客37422655...:先面一面探探口风,真要转销售就得把提成问清楚;说不定还能内部跳回技术,别直接拒。
我的工作日记
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务