当前位置:编程学习 > C/C++ >>

这个程序用C++运行为什么不出结果呢?

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode;
int initlist(Lnode *L){
Lnode *p,*r;
int i;
L=(Lnode*)malloc(sizeof(Lnode));
if(!L) exit(1);
L->next=NULL;
r=L;
for(i=1;i<=10;i++){
p=(Lnode*)malloc(sizeof(Lnode));
scanf("%d",&p->data);
r->next=p;r=p;
}
r->next=NULL;
return;
}
void printlist(Lnode *L){
int e[10],i;
Lnode *p;
p=L;
for(i=0;i<10;i++){
e[i]=p->data;
printf("%d",e[i]);
p++;
}
}
main(){
int n;
Lnode L;
initlist(&L);
printlist(&L);
return(0);
}
答案:楼上“xjumabin”犯概念性错误,scanf("%d",p)将导致不可预知的内存错误。

你的代码我大致改了下,测试的运行结果:

Enter 10 numbers:
1
2
3
4
5
6
7
8
9
0
1 2 3 4 5 6 7 8 9 0
Press any key to continue

--------------------

VC6,Win-TC2调试通过。代码如下,仔细看看注释:

-------------

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;conio.h&gt;

#define MAXNODE 10 // 链表长度,至少为1

typedef int Elemtype;
typedef struct Lnode{

Elemtype data;

struct Lnode *next;
/*
} Lnode; // 有歧义,最好不要把struct Lnode重命名为Lnode,建议重命名为NODE,以便区别
*/
} NODE, *LIST;

int initlist(LIST L)
{

NODE *p=NULL,*r=L;

int i=0;

/*

L=(LIST)malloc(sizeof(NODE)); // 不能在这里改变L的值,应该在main函数中申请。

*/

if(!L) exit(1);

scanf("%d",&L-&gt;data); // 首元素的data在这里输入

L-&gt;next=NULL;

for(i=2;i&lt;=MAXNODE;i++) // 下标从2开始循环

{

p=(NODE*)malloc(sizeof(NODE));


scanf("%d",&p-&gt;data);


r-&gt;next=p;

r=p;

}

r-&gt;next=NULL;

return 0; // 必须返回整型值
}

void printlist(LIST L)
{

NODE *p=L;

while(p)

{

printf("%d ",p-&gt;data);


if(p-&gt;next) p=p-&gt;next; else p=NULL; // 或者简写为 p=(p-&gt;next)?p-&gt;next:NULL;

}

printf("\
");
}

void freelist(LIST L) // 由于程序中使用malloc动态分配空间,因此需要使用free来手动释放
{

NODE *p=L,*tmp=NULL;

while(p)

{

if(p-&gt;next) tmp=p-&gt;next; else tmp=NULL; // 或者简写为 tmp=(p-&gt;next)?p-&gt;next:NULL;

free(p);


p=tmp;

}
}

int main() // 返回整型值的函数需要正确的声明返回值类型
{

/*

int n; // 未使用的局部变量

*/

LIST L=(LIST)malloc(sizeof(NODE));

printf("Enter %d numbers:\
",MAXNODE);

initlist(L);

printlist(L);

freelist(L); // 释放空间

getch();

return(0);
}

上一个:C++ 关于delete 和new 函数的问题
下一个:c++中 怎样声明多虚部的复数

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,