| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 851 人关注过本帖
标题:请教c primer plus(第五版中文) 上的一个程序
取消只看楼主 加入收藏
ujszmc
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
请教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
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
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.013186 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved