鱼C论坛

 找回密码
 立即注册
查看: 2450|回复: 7

请教大神C语言链表

[复制链接]
发表于 2014-7-24 21:13:49 | 显示全部楼层 |阅读模式
10鱼币
// 很简单的一个C语言链表,就是创建一个数目为NUM 的链表, 然后打印出来,最后清空 ,程序就完了
// 只是运行时出了问题,显示一个8XXXXXX 的数据,程序返回一个255 , 我是在codeblock , 谁帮我找一下问题出在哪了。。一点金币1414
#include<stdio.h>
#include<stdlib.h>
#define LEN  sizeof(struct list)
struct list{
int value ;
struct list *next ;
};
typedef struct list  list , *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) ;
return  0 ;
}

最佳答案

查看完整内容

creatlist函数创建链表的时候多创建了一个节点,可是你没有把这个多余的节点value赋值,所以最后会输出你说的那个错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 21:13:50 | 显示全部楼层
 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赋值,所以最后会输出你说的那个错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 21:31:36 | 显示全部楼层
clearlist()出错了,循环结束时p已经为空了,p->next就不存在了。释放链表简单点直接让头指针指向空就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 21:57:44 | 显示全部楼层
确实clearlist 函数存在一点问题,去掉p->next = NULL  语句 , 函数仍然有返回的异常值。另外clearlist 最终要释放 申请 结点 的空间 , 只是将head = NULL 的话 ,结点所占空间没有释放,会造成内存泄露,所以呢,我觉得不能简单的将 head =NULL ,来清除结点。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-24 22:34:34 | 显示全部楼层
p->next = NULL 不需要,不会造成内存泄露。showlist里面的while应该是while( p->next != NULL ),这样就不会出现乱码了

评分

参与人数 1鱼币 +1 收起 理由
haovcf + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-24 23:18:02 | 显示全部楼层
额,经过测试,确实 是多了一个节点,幸运的是,我自己找到了解决方法,不过,仍要感谢楼上热心回复。感谢你的时间。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-25 13:54:13 From FishC Mobile | 显示全部楼层
我空间有片日志发了最简单的链表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-27 15:35:25 | 显示全部楼层
我也不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 16:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表