请教大神C语言链表
// 很简单的一个C语言链表,就是创建一个数目为NUM 的链表, 然后打印出来,最后清空 ,程序就完了// 只是运行时出了问题,显示一个8XXXXXX 的数据,程序返回一个255 , 我是在codeblock , 谁帮我找一下问题出在哪了。。一点金币1414
#include<stdio.h>
#include<stdlib.h>
#define LENsizeof(struct list)
struct list{
int value ;
struct list *next ;
};
typedef struct listlist , *plist ;
plist creatlist( int num)
{
plist head , p , q ;
int count = 0 ;
p = (plist) malloc(LEN) ;
head = p;
while( p != NULL && count < num )
{
++count ;
printf("input %d point list p->value " , count) ;
scanf("%d",&p->value ) ;
q = (plist) malloc( LEN ) ;
p->next = q ;
p = q ;
}
p->next = NULL;
if( !head )
{
printf("sorry , meay be momery wrong") ;
return NULL ;
}
else
return head ;
}
void showlist( plist head )
{
plist p = head ;
while( p != NULL )
{
printf("%d\n",p->value) ;
p = p->next ;
}
}
void clearlist( plist head )
{
plist q , p = head ;
while(p != NULL )
{
q = p->next ;
free(p) ;
p = q ;
}
p->next = NULL ;
}
int main( void )
{
plist head ;
int num ;
printf("please input the number num you creatlist") ;
scanf("%d",&num) ;
head = creatlist(num ) ;
showlist(head) ;
clearlist(head) ;
return0 ;
}
plist creatlist( int num )
{
plist head , p , q ;
int count = 0 ;
p = (plist) malloc(LEN) ;
head = p;
while( p != NULL )
{
++count ;
printf("input %d point list p->value " , count) ;
scanf("%d",&p->value ) ;
if(count >= num)
{
break;
}
q = (plist) malloc( LEN ) ;
p->next = q ;
p = q ;
}
p->next = NULL;
if( !head )
{
printf("sorry , meay be momery wrong") ;
return NULL ;
}
else
{
return head ;
}
}
creatlist函数创建链表的时候多创建了一个节点,可是你没有把这个多余的节点value赋值,所以最后会输出你说的那个错误。 clearlist()出错了,循环结束时p已经为空了,p->next就不存在了。释放链表简单点直接让头指针指向空就可以了 确实clearlist 函数存在一点问题,去掉p->next = NULL语句 , 函数仍然有返回的异常值。另外clearlist 最终要释放 申请 结点 的空间 , 只是将head = NULL 的话 ,结点所占空间没有释放,会造成内存泄露,所以呢,我觉得不能简单的将 head =NULL ,来清除结点。。 p->next = NULL 不需要,不会造成内存泄露。showlist里面的while应该是while( p->next != NULL ),这样就不会出现乱码了 额,经过测试,确实 是多了一个节点,幸运的是,我自己找到了解决方法,不过,仍要感谢楼上热心回复。感谢你的时间。。 我空间有片日志发了最简单的链表 我也不会
页:
[1]