| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 851 人关注过本帖
标题:请教c primer plus(第五版中文) 上的一个程序
只看楼主 加入收藏
ujszmc
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
请教c primer plus(第五版中文) 上的一个程序
目前正在学习中。。。
书上501页这个AddItem函数
图片附件: 游客没有浏览图片的权限,请 登录注册

按照书上所说C函数要想改变调用程序中的变量,唯一的途径就是使用指向改变量的指针。
这个程序目的是要修改链表movies,向movies末尾添加新的项目,所以该函数接受了一个item参数和一个指向链表的指针。
  如果是空链表
    *plist=pnew;//通过指针把新项目放在链表头部,这个没问题
  如果不是空链表
    while(scan->!=NULL)
    scan=scan->next;//找到链表结尾
  问题是下面scan->next=pnew;//这个真的能把新项目添加到链表结尾吗?
  scan只是在这个函数里定义的一个链表,如果不通过指针*plist修改是不能改变原来的链表movies的吧?

[ 本帖最后由 ujszmc 于 2015-5-24 20:13 编辑 ]
搜索更多相关主题的帖子: 中文 新项目 movies 
2015-05-24 20:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
对呀,就是这么做的。你不理解链表的机制而已,与语法和语言无关。未接触到的领域,可以忽略这类例题。你当前要学的是语言,不是链表。

授人以渔,不授人以鱼。
2015-05-24 20:20
ujszmc
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
收藏
得分:0 
回复 2楼 TonyDeng
我是这么想的:
    List movies;
    int a;//且把List看成一种新的数据类型,那么List的用法与int类似;
    那么我用int类型打个比方:
        void function(int *p)
        {
            int b=*p;
            *p=12;//这个确实能改变a的值没错
            b=13;//这句岂能改变a的值?
        }
        ...
        int main(void)
        {
            int a;
            function(&a);
            ...
        }
这个问题搞不懂,下面的对列更没法看了,请大神详细解释一下

[ 本帖最后由 ujszmc 于 2015-5-24 20:35 编辑 ]
2015-05-24 20:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 3楼 ujszmc
那是两个不同性质的问题,不是这么等价。原代码中关键的地方,是在函数内用malloc()分配内存,那是在堆中的,永久存在,不会随着函数的结束而被销毁,所以在函数内部对堆数据赋值,出去之后也仍然有效,链表中,只要记录下个结点的指针值即可,不是记结点的数据值。

授人以渔,不授人以鱼。
2015-05-24 20:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
书上使用了malloc(),就必须在介绍这个函数的知识点之后才能举这样的例子。要么你没看或忘了,要么是它编排不当。

授人以渔,不授人以鱼。
2015-05-24 20:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
什么叫没法往下看!书都可以跳开看,在序言中就有指导哪部分可以跳开、哪些必须循序渐进,还有指出应有什么基础,那才是最需要先了解的,很多人读书不读序言而已。我学编程,从来都不敲和读书上的例题,直接写应用程序,要用的就现学,哪有必须先看完全书才能工作的道理。学习是现实需求迫出来的,不是读书读出来的。

授人以渔,不授人以鱼。
2015-05-24 20:48
ujszmc
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
收藏
得分:0 
回复 6楼 TonyDeng
是的,受教了。。。

我刚刚用下面代码运行了一下,省去了没用到的函数,其余和书上例子基本相同(暂时不考虑释放内存等)
我一共输入了三次项目(一个项目包括电影名和评分)但是只显示了我第一次输入的项目,其余两项并没有显示
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct film{
    char title[45];
    int rating;
}Item;
typedef struct node{
    Item item;
    struct node *next;
}Node;
typedef Node * List;

void Initialize(List *head);
int Additem(Item item, List *head);
void Traverse(const List *head);

int main(void)
{
    List movies;
    Item temple;

    Initialize(&movies);  //初始化

    puts("Enter first movie title:");
    while (gets(temple.title) != NULL&&temple.title[0] != '\0')
    {
        puts("Enter your rating<0-10>:\n");
        scanf("%d", &temple.rating);
        while (getchar() != '\n');
        if (Additem(temple, &movies) == 0)
        {
            printf("Problem allocating memory.\n");
            break;
        }
        puts("Enter next movie title:\n");
    }

    //显示
    printf("Here is the movie list.\n");
    Traverse(&movies);
    while (getchar() != '\n');
    getchar();
    return 0;
}

void Initialize(List *head)
{
    *head = NULL;
}

int Additem(Item item,List *head)
{
    List nitem;
    List current=*head;
                
    nitem = (Node *)malloc(sizeof(Node));
    if (nitem == NULL)
        return 0;
    nitem->item = item;
    nitem->next = NULL;
    if (current == NULL)
    {
        *head = nitem;
    }
    else
    {
        while (current != NULL)
        {
            current= current->next;
        }
        current = nitem;  
    }

    return 1;
}
void Traverse(const List *head)
{
    List pnode = *head;
    while (pnode != NULL)
    {
        printf("title :%s ,rating:%d.\n", pnode->item.title, pnode->item.rating);
        pnode = pnode->next;
    }
}
2015-05-24 21:10
快速回复:请教c primer plus(第五版中文) 上的一个程序
数据加载中...
 
   



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

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