愿你 发表于 2018-3-23 11:21:05

为什么程序执行有误啊求大神帮助~

# 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-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本来就是指针类型了~就没必要再取地址了~你再取个地址,就要解一层~

愿你 发表于 2018-3-24 19:21:30

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

因为我之前看的关于它们的区别 如果要是指针值发生改变那就要用指针的指针 所以我就用了{:5_107:}
你看看呗https://blog.csdn.net/gaoyi221119/article/details/72639059
刚学数据结构 好难啊...

愿你 发表于 2018-3-24 19:22:06

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

谢谢你这么用心的看我代码啦~

愿你 发表于 2018-3-24 19:45:36

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

https://blog.csdn.net/pengshaob/article/details/70941993我在这篇博客里看到的也是用指向指针的指针好懵阿...{:5_107:}{:5_107:}

愿你 发表于 2018-3-24 20:11:37

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

我照你的进行了修改 可是程序运行还是和之前一样{:5_99:}{:5_100:}


# 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;

}

风过无痕丶 发表于 2018-3-24 20:23:02

我看了你贴的哪个博文,可能我才疏学浅吧~我看不出一点好处~要用就要解一次~这种做法 在我看来很蠢…按照我的理解二级指针就是为了修改一级指针所用的~明明一层指针就能达到的效果,非要搞两层,要用了还要解一层…如果一定说这么写的好处是什么,我觉得可能就排序的时候换整个节点的时候好用一点吧~

愿你 发表于 2018-3-24 20:24:51

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

现在我修改的这个依旧运行不出来T^T

风过无痕丶 发表于 2018-3-24 20:24:58

还有,我记得你的scanf里面好像有一个空格,记得把它删除了

愿你 发表于 2018-3-24 20:28:29

风过无痕丶 发表于 2018-3-24 20:24
还有,我记得你的scanf里面好像有一个空格,记得把它删除了

删除了也还是不对T^T

风过无痕丶 发表于 2018-3-24 20:37:55

你这个新节点的拼接跟谁学的啊…有首无尾… 这样就算你拼接成功了~那怎么判定到尾结点没有啊~你仔细看一下我的那个 是怎么拼接的~

愿你 发表于 2018-3-24 20:40:18

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

跟老师...{:5_102:}我研究研究

风过无痕丶 发表于 2018-3-24 20:46:16

那就很抱歉了!我这写的单链表!

愿你 发表于 2018-3-24 20:51:13

风过无痕丶 发表于 2018-3-24 20:46
那就很抱歉了!我这写的单链表!

太难学了要崩溃了

人造人 发表于 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

我的调试器已经捕捉到了这个问题



就算我强制跳过检查继续执行,虽然显示初始化成功,但是 L 并没有改变,依然未初始化

人造人 发表于 2018-3-24 20:54:50

想要修改某一个变量,必须把它的地址传过去

愿你 发表于 2018-3-24 20:55:37

谢谢你啦 这个问题我之前看过相关博客 可是我不会用 不懂什么什么时候用, 指向指针的指针更是一头雾水{:5_107:}

风过无痕丶 发表于 2018-3-24 20:56:14

我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我当初就这么学的…还有!这只是冰山一角~后面还有队列!递归! 树!图!

愿你 发表于 2018-3-24 20:57:04

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

我就是这样做的啊 可能理解能力不太好{:5_107:}

人造人 发表于 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”
页: [1] 2 3
查看完整版本: 为什么程序执行有误啊求大神帮助~