鱼C论坛

 找回密码
 立即注册
查看: 3016|回复: 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 编辑
  1. #pragma warning(disable : 4996)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>


  5. typedef struct Node
  6. {
  7.         int data;
  8.         struct Node *next;

  9. }NODE, *linklist;


  10. linklist initlist(void)
  11. {
  12.         linklist pHead = (linklist)malloc(sizeof(NODE));

  13.         if (pHead == NULL)
  14.         {
  15.                 printf("无法分配空间,初始化失败。");
  16.                 exit(-1);
  17.         }
  18.         printf("初始化成功\n");
  19.        
  20.        
  21.         return pHead;
  22. }

  23. void creatlist(linklist L)
  24. {
  25.         int i, val, n;

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

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

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

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

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

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

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


  76. int main()
  77. {
  78.         linklist L = NULL;

  79.         L = initlist();
  80.         creatlist(L);
  81.         seelist(L);

  82.         system("pause");
  83.         return 0;

  84.        
  85. }

复制代码


你何必写那么多层指针为难自己呢~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 | 显示全部楼层
  1. int main()
  2. {
  3.         linklist L;

  4.         initlist(L);
  5.         creatlist(L);
  6.         seelist(L);

  7.         return 0;

  8. }
复制代码




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-3-29 22:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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