关于C语言,链表的问题,我已经看了好几遍,都木有发现错误在哪里,求高手……

程序稍稍有点长,我大概讲一下程序的内容
void CreateList(LinkList L,int n)创建一个链表,逆序输入数据
void DelMinNode(LinkList head)删除其中最小的一个数据
void PrintList(LinkList L)输出所有数据
ps:下述代码是数据结构老师上课讲的,用的是伪语言,上机时让我们用C语言,但是我已经反复看了好几遍,就是运行结果不对

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;

void CreateList(LinkList L,int n)
{
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("Please input:");
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}

void DelMinNode(LinkList head)
{
LinkList p=head->next,pre=head;
LinkList minp,minpre;
int min=p->data;
minp=p;
minpre=pre;
while(p!=NULL)
{
if(p->data<min)
{
min=p->data;
minp=p;
minpre=pre;
}
pre=p;
p=p->next;
}
minpre->next=minp->next;
free(minp);
}

void PrintList(LinkList L)
{
LinkList p=L->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
}

main()
{
LinkList La;
int num;
printf("Please enter the number:");
scanf("%d\n",&num);
CreateList(La,num);
DelMinNode(La);
PrintList(La);
}

第1个回答  2012-09-23
#include<stdio.h>#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;

void CreateList(LinkList *L,int n) /*函数应该这样才行,解释见下*/
{
int i;
LinkList p;

*L=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("Please input:");
scanf("%d",&p->data);
p->next=(*L)->next;
(*L)->next=p;
}
}

void DelMinNode(LinkList head)
{
LinkList p=head->next,pre=head;
LinkList minp,minpre;
int min=p->data;
minp=p;
minpre=pre;
while(p!=NULL)
{
if(p->data<min)
{
min=p->data;
minp=p;
minpre=pre;
}
pre=p;
p=p->next;
}
minpre->next=minp->next;
free(minp);
}

void PrintList(LinkList L)
{
LinkList p=L->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
}

main()
{
LinkList La;
int num;

printf("Please enter the number:");
scanf("%d",&num); /*这里的\n去掉*/
getch(); /*刚开始你的scanf里多了个\n没看见所以加了这句调试了下*/
CreateList(&La,num); /*调用时函数要匹配,故加&*/
DelMinNode(La);
PrintList(La);
}

creat函数里的L是局部变量,你malloc后,它重新指向新的地址,故让它变成二级指针。
这样你就可以对La(main里的)操作了。
另外,你的程序还有个重大BUG,会产生内存泄漏,你malloc的内容没有全部free,故还需要在main结束最后,将La全部free.这里我没有帮你写,还有什么问题,可以继续追问

亲,同样也谢谢你啦
关于这一句:void CreateList(LinkList L,int n)
因为有typedef LNode *LinkList;所以LinkList已经是指针类型了,故L前不必再加*了(这个是我上课时候问老师的)
不过,你楼上那位亲也答的很认真,所以按照先来后到的原则……我不得不……sorry
不然,下次我有问题找你吖

追答

你CreateList(LinkList L,int n)里的L指针在malloc后,变了,它指向了堆里的空间,这就间接与你传参的愿望不符。
这个同销毁链表的原理是一样,销毁链表的时候也是二级指针,这里也需要二级指针,不过也可以同那个建头结点的方法。但是销毁不得不用二级指针。

追问

亲,不好意思啊,我学的还木有你说的那么深,不是很看得懂,sorry

本回答被网友采纳
第2个回答  2012-09-23
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList &L,int n) //创建一个链表,逆序输入数据
{
int i;
LinkList p,r;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
r=L;
for(i=0;i<n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=r->next;
r->next=p;
r=p;
}
}

void DelMinNode(LinkList head) //删除其中最小的一个数据
{
LinkList p=head->next,pre=head;
LinkList minp,minpre;
int min=p->data;
minp=p;
minpre=pre;
while(p!=NULL)
{
if(p->data<min)
{
min=p->data;
minp=p;
minpre=pre;
}
pre=p;
p=p->next;
}
minpre->next=minp->next;
free(minp);
}

void PrintList(LinkList L) //输出所有数据
{
LinkList p=L->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
}

main()
{
LinkList La;
int num;
printf("Please enter the number:");
scanf("%d\n",&num);
CreateList(La,num);
//PrintList(La);
DelMinNode(La);
PrintList(La);
system("pause");
return 0;
}

void CreateList(LinkList &L,int n) //创建一个链表,逆序输入数据
这个调用函数应该加地址符号&,还有在这个函数里面应该再建立一个结点r
第3个回答  2012-09-23
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;

void CreateList(LinkList L,int n)
{
int i;
LinkList p;
//L=(LinkList)malloc(sizeof(LNode)); // 调用前已分配内存
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("Please input:");
scanf("%d",&p->data);
p->next=L->next; // 头插法
L->next=p;
}
}

void DelMinNode(LinkList head)
{
LinkList p=head->next,pre=head;
LinkList minp,minpre;
int min=p->data;
minp=p;
minpre=pre;
while(p!=NULL)
{
if(p->data<min)
{
min=p->data;
minp=p;
minpre=pre;
}
pre=p;
p=p->next;
}
minpre->next=minp->next;
free(minp);
}

void PrintList(LinkList L)
{
LinkList p=L->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
}

int main()
{
LinkList La;
int num;
printf("Please enter the number:");
scanf("%d",&num);
La=(LinkList)malloc(sizeof(LinkList));
CreateList(La,num); //La使用前要先初始化
DelMinNode(La);
PrintList(La);
return 0;
}追问

哇塞……亲,谢谢你吖,行了

但是、貌似还有一个小小小小问题,就是

开始运行  出现Please enter the number:于是我就输入4,

但是按回车,我觉得它应该来句  Please input:让我输入数据

但是木有看到Please input:  当我输入一个数据之后,它显示两遍Please input:

后面几个都正常,这个小问题怎么解决吖,看图片

追答

printf("Please enter the number:");
scanf("%d\n",&num); ----把/n去掉

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网