鱼C论坛

 找回密码
 立即注册
查看: 3507|回复: 54

[已解决]为什么程序执行有误啊求大神帮助~

[复制链接]
发表于 2018-3-23 11:21:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


typedef struct Node
{
        int data;
        struct Node *next;
}Node,*linklist;

int initlist(linklist *L)
{
        int i;
        (*L)=(linklist)malloc(sizeof(Node));
        if((*L)==NULL)
        {
                printf("无法分配空间,初始化失败。");
                return 0;
        }
        (*L)->next=NULL;
        printf("初始化成功\n");
        return 0;
}

int creatlist(linklist *L)
{
        linklist p=*L;
        int i,n,j;
        printf("请问您想输入多少个元素:");
        scanf("%d",&n);
        for(i=n,j=0;i>0;i--,j++)
        {
                p=(linklist)malloc(sizeof(Node));
                printf("请输入第%d个元素",j+1);
                scanf("%d ",&p->data);
                p->next=(*L)->next;
                (*L)->next=p;
        }
        return 0;
}

int seelist(linklist L)
{
        int k=0;
        linklist p=NULL;
        p=L->next;

        while(p)
        {
                printf("%d  ",p->data);
                p=p->next;
                p++;
        }
        if(k==0)
        {
                printf("链表为空。");
                return -1;
        }
        return 0;
}


int main()
{
        linklist L;
        initlist(&L);
        creatlist(&L);
        seelist(L);
        return 0;

}

最佳答案
2018-3-24 22:01:17

如果要修改一个变量,必须传地址
如果只是使用它的值,那就无所谓了,传地址和传值都可以
如果这个变量比较大,建议传地址,这样速度可以很快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-23 12:28:08 | 显示全部楼层
本帖最后由 风过无痕丶 于 2018-3-23 12:31 编辑
#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedef struct Node
{
        int data;
        struct Node *next;

}NODE, *linklist;


linklist initlist(void)
{
        linklist pHead = (linklist)malloc(sizeof(NODE));

        if (pHead == NULL)
        {
                printf("无法分配空间,初始化失败。");
                exit(-1);
        }
        printf("初始化成功\n");
        
        
        return pHead;
}

void creatlist(linklist L)
{
        int i, val, n;

        printf("请问您想输入多少个元素:");
        scanf("%d", &n);
        

        linklist pTail = L;
        pTail->next = NULL; // 让它指向尾节点~

        for (i = 0; i < n; i++)
        {
                printf("请输入第%d个元素",i + 1);
                scanf("%d", &val);

                //        p = (linklist)malloc(sizeof(NODE)); // 你这里准备直接覆盖吗?
                
                linklist pNew = (linklist)malloc(sizeof(NODE));
                // 这里在检查一下是不是节点都生成成功了!
                if (pNew == NULL) {
                        printf("空间分配失败,程序结束!\n");
                        exit(-1);
                }
                pNew->data = val;
                pTail->next = pNew;
                pNew->next = NULL;
                pTail = pNew;

                
                /*
                printf("请输入第%d个元素", j + 1);
                scanf("%d ", &p->data);
                p->next = L->next;
                L->next = p;
        */   // 按照我的理解。 这里应该造一个节点赋值一个节点
        }
}

void seelist(linklist L)
{  // 这里是输出函数? 那返回一个值回去干什么啊。。 没意义啊~
        int k = 0;
        linklist p = NULL;
        p = L->next;

        while (p != NULL)
        {
                printf("%d  ", p->data);
                p = p->next;
                //p++; 这里的P++是什么操作?
        }
/*
        if (k == 0)    这里的K又代表什么,他呗初始化了0 这一条是肯定会被运行的~为什么会让他来判断链表是不是为空~
        {
                printf("链表为空。");
                return -1;
        }
        return 0;
*/
}


int main()
{
        linklist L = NULL;

        L = initlist();
        creatlist(L);
        seelist(L);

        system("pause");
        return 0;

        
}

你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要解一层~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 19:21:30 | 显示全部楼层
风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...

因为我之前看的关于它们的区别 如果要是指针值发生改变那就要用指针的指针 所以我就用了
你看看呗https://blog.csdn.net/gaoyi221119/article/details/72639059
刚学数据结构 好难啊...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 19:22:06 | 显示全部楼层
风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...

谢谢你这么用心的看我代码啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 19:45:36 | 显示全部楼层
风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...

https://blog.csdn.net/pengshaob/article/details/70941993我在这篇博客里看到的也是用指向指针的指针  好懵阿...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:11:37 | 显示全部楼层
风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...

我照你的进行了修改 可是程序运行还是和之前一样


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


typedef struct Node
{
        int data;
        struct Node *next;
}Node,*linklist;

int initlist(linklist L)
{
        L=(linklist)malloc(sizeof(Node));
        if(L==NULL)
        {
                printf("无法分配空间,初始化失败。");
                return -1;
        }
        L->next=NULL;
        printf("初始化成功\n");
        return 0;
}

int creatlist(linklist L)
{
        linklist p=L,pnew;
        int i,n,val;

        printf("请问您想输入多少个元素:");
        scanf("%d",&n);

        for(i=0;i<n;i++)
        {
                printf("请输入第%d个元素",i+1);
                scanf("%d ",&val);
               
                pnew=(linklist)malloc(sizeof(Node));
                if(pnew==NULL)
                {
                        printf("空间分配失败,程序结束。");
                        return -1;
                }
                pnew->data=val;
                pnew->next=p->next;
                p->next=pnew;
        }
        return 0;
}

void seelist(linklist L)
{
        int k=0;
        linklist p=NULL;
        p=L->next;

        while(p)
        {
                printf("%d  ",p->data);
                p=p->next;
        }
}

int main()
{
        linklist L;
        initlist(L);
        creatlist(L);
        seelist(L);
        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:23:02 From FishC Mobile | 显示全部楼层
我看了你贴的哪个博文,可能我才疏学浅吧~我看不出一点好处~要用就要解一次~这种做法 在我看来很蠢…按照我的理解二级指针就是为了修改一级指针所用的~明明一层指针就能达到的效果,非要搞两层,要用了还要解一层…如果一定说这么写的好处是什么,我觉得可能就排序的时候换整个节点的时候好用一点吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:24:51 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:23
我看了你贴的哪个博文,可能我才疏学浅吧~我看不出一点好处~要用就要解一次~这种做法 在我看来很蠢…按照我 ...

现在我修改的这个依旧运行不出来T^T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:24:58 From FishC Mobile | 显示全部楼层
还有,我记得你的scanf里面好像有一个空格,记得把它删除了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:28:29 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:24
还有,我记得你的scanf里面好像有一个空格,记得把它删除了

删除了也还是不对T^T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:37:55 From FishC Mobile | 显示全部楼层
你这个新节点的拼接跟谁学的啊…有首无尾… 这样就算你拼接成功了~那怎么判定到尾结点没有啊~你仔细看一下我的那个 是怎么拼接的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:40:18 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:37
你这个新节点的拼接跟谁学的啊…有首无尾… 这样就算你拼接成功了~那怎么判定到尾结点没有啊~你仔细看一下 ...

跟老师...我研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:46:16 From FishC Mobile | 显示全部楼层
那就很抱歉了!我这写的单链表!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:51:13 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:46
那就很抱歉了!我这写的单链表!

太难学了要崩溃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:53:10 | 显示全部楼层
int main()
{
        linklist L;

        initlist(L);
        creatlist(L);
        seelist(L);

        return 0;

}



C语言传递参数的时候是按值传递
initlist(L); 执行时把 L 复制一份传递给 initlist 函数,不管 initlist 函数做什么,都不会影响到当前函数的这个 L

我的调试器已经捕捉到了这个问题
无标题.png


就算我强制跳过检查继续执行,虽然显示初始化成功,但是 L 并没有改变,依然未初始化
无标题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:54:50 | 显示全部楼层
想要修改某一个变量,必须把它的地址传过去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:55:37 | 显示全部楼层
谢谢你啦 这个问题我之前看过相关博客 可是我不会用 不懂什么什么时候用, 指向指针的指针更是一头雾水
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:56:14 From FishC Mobile | 显示全部楼层
我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我当初就这么学的…还有!这只是冰山一角~后面还有队列!递归! 树!图!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 20:57:04 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:56
我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我 ...

我就是这样做的啊 可能理解能力不太好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:57:55 | 显示全部楼层
风过无痕丶 发表于 2018-3-24 20:56
我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我 ...

不管 initlist(L); 做什么
根本无法影响 main 函数中的这个 L

1>c:\visualstudioprojects\tmp\tmp\main.c(67): warning C4700: 使用了未初始化的局部变量“L”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 16:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表