为什么程序执行有误啊求大神帮助~
# 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: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-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...
因为我之前看的关于它们的区别 如果要是指针值发生改变那就要用指针的指针 所以我就用了{:5_107:}
你看看呗https://blog.csdn.net/gaoyi221119/article/details/72639059
刚学数据结构 好难啊... 风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...
谢谢你这么用心的看我代码啦~ 风过无痕丶 发表于 2018-3-23 12:28
你何必写那么多层指针为难自己呢~linklist本来就是指针类型了~就没必要再取地址了~你再取个地址,就要 ...
https://blog.csdn.net/pengshaob/article/details/70941993我在这篇博客里看到的也是用指向指针的指针好懵阿...{:5_107:}{:5_107:} 风过无痕丶 发表于 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
我看了你贴的哪个博文,可能我才疏学浅吧~我看不出一点好处~要用就要解一次~这种做法 在我看来很蠢…按照我 ...
现在我修改的这个依旧运行不出来T^T 还有,我记得你的scanf里面好像有一个空格,记得把它删除了 风过无痕丶 发表于 2018-3-24 20:24
还有,我记得你的scanf里面好像有一个空格,记得把它删除了
删除了也还是不对T^T 你这个新节点的拼接跟谁学的啊…有首无尾… 这样就算你拼接成功了~那怎么判定到尾结点没有啊~你仔细看一下我的那个 是怎么拼接的~ 风过无痕丶 发表于 2018-3-24 20:37
你这个新节点的拼接跟谁学的啊…有首无尾… 这样就算你拼接成功了~那怎么判定到尾结点没有啊~你仔细看一下 ...
跟老师...{:5_102:}我研究研究 那就很抱歉了!我这写的单链表! 风过无痕丶 发表于 2018-3-24 20:46
那就很抱歉了!我这写的单链表!
太难学了要崩溃了 int main()
{
linklist L;
initlist(L);
creatlist(L);
seelist(L);
return 0;
}
C语言传递参数的时候是按值传递
initlist(L); 执行时把 L 复制一份传递给 initlist 函数,不管 initlist 函数做什么,都不会影响到当前函数的这个 L
我的调试器已经捕捉到了这个问题
就算我强制跳过检查继续执行,虽然显示初始化成功,但是 L 并没有改变,依然未初始化
想要修改某一个变量,必须把它的地址传过去
谢谢你啦 这个问题我之前看过相关博客 可是我不会用 不懂什么什么时候用, 指向指针的指针更是一头雾水{:5_107:} 我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我当初就这么学的…还有!这只是冰山一角~后面还有队列!递归! 树!图! 风过无痕丶 发表于 2018-3-24 20:56
我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我 ...
我就是这样做的啊 可能理解能力不太好{:5_107:} 风过无痕丶 发表于 2018-3-24 20:56
我建议你 拿一张纸,一直笔~在纸上把几个节点画出来,标注出指针域 和数据域,节点该怎么移动 一目了然~ 我 ...
不管 initlist(L); 做什么
根本无法影响 main 函数中的这个 L
1>c:\visualstudioprojects\tmp\tmp\main.c(67): warning C4700: 使用了未初始化的局部变量“L”