| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 465 人关注过本帖
标题:关于链表的问题
只看楼主 加入收藏
行书万里
Rank: 2
等 级:论坛游民
帖 子:11
专家分:40
注 册:2012-7-12
结帖率:40%
收藏
已结贴  问题点数:20 回复次数:4 
关于链表的问题
下面的程序中,如果使用注释"//"后面的语句,编译ok,但是无法运行。
希望高手解答下面两种写法的区别。


/*--------------------------------------------------------------------------
输入数字,分配内存存储输入的数字,然后将存储的数字输到屏幕
--------------------------------------------------------------------------*/

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int item;
struct node *next;
}Node;

typedef Node* List;
void InitList(List *pt);
bool AddValue(List *plist,int item);
void OutPut(const List *list);
void FreeMem(List list);

int main(void)
{
int num;
List list; //List *list;
InitList(&list);//InitList(list);

puts("Please input a number:");
scanf("%d",&num);

while(getchar()!='\n')
continue;


if(AddValue(&list,num)) //if(AddValue(list,num))
//printf("%d\n",list->item);//printf("%d\n",(*list)->item);
OutPut(&list);//OutPut(list);
else
puts("alloc failed!");

FreeMem(list);

puts("Bye!");
return 0;
}



void InitList(List *pt)
{
*pt=NULL;
}


bool AddValue(List *pt,int n)
{
Node *pnew;
Node *current;
current=*pt;
pnew=(Node *)malloc(sizeof(Node));
if(pnew==NULL)
{
puts("failed!");
return false;
}

if(current==NULL)
*pt=pnew;
else
{
while(current->next!=NULL)
current=current->next;
current->next=pnew;
}

pnew->next=NULL;
pnew->item=n;

return true;
}

void OutPut(const List *list)
{
Node *temp=*list;
while(temp!=NULL)
{
printf(">%d<\n",temp->item);
temp=temp->next;
}

}

void FreeMem(List list)
{
Node *p=list;
Node *pt=list;
while(p!=NULL)
{
pt=p->next;
free(p);
p=pt;
}
}

[ 本帖最后由 行书万里 于 2013-5-21 22:01 编辑 ]
搜索更多相关主题的帖子: include 
2013-05-21 19:52
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:4 
哪里错误啊!

Maybe
2013-05-21 22:54
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:4 
除了少加一个头文件#include<stdbool.h>,好像没错吧!

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-05-22 07:39
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:4 
我想问一下楼主,你在编译器里编译的时候也是这个书写规则吗?

如果成行无法运行的话,很有可能是因为编写的不规范。

建议楼主注意规范,特别是循环体,必要的时候加个大括号,防止作用域的破坏。

比如:
if(current==NULL)
*pt=pnew;
else
{
while(current->next!=NULL)
current=current->next;
current->next=pnew;
}
这段代码是会出现问题的。有可能会出现判断语句不相符的情况先还是执行循环体的内容

保险的写法是:
程序代码:
    if(pnew==NULL)
    {
        puts("failed!");
        return false;
    }
   
    else if(current==NULL)
    {
        *pt=pnew;
    }
       
    else
    {
        while(current->next!=NULL)
        {
            current=current->next;
            current->next=pnew;
        }
           
    }
将循环所属的代码都放在一个作用域里,防止意外的错误。

希望对楼主有用。


Edsger Dijkstra:算法+数据结构=程序
2013-05-22 10:55
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:4 
CPP最后一章的示例程序吧..

我感觉这例子有几个地方有错误

我感觉到不解的地方:

typedef Node* List;
void InitList(List *pt);
bool AddValue(List *plist,int item);
void OutPut(const List *list);
void FreeMem(List list);

int main(void)
{
int num;
List list; //List *list;

下面还有类似的就不全标注了

typedef Node * List; //这是定义一个结构指针类型的同义字List吧
List 就是 Node *
那么List * plist 就是 Node ** plist ?
2013-05-22 11:14
快速回复:关于链表的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024562 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved