| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1526 人关注过本帖
标题:C primer plus上的一个链表示例代码
只看楼主 加入收藏
qq200258
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-10-29
结帖率:0
收藏
 问题点数:0 回复次数:9 
C primer plus上的一个链表示例代码
程序代码:
#include <stdio.h>
#include <stdlib.h> /* 提供malloc原型 */
#include <string.h> /* 提供strcpy原型 */
#define TSIZE 45    /* 储存片名的数组大小 */



struct film {  //定义链表结构
    char title[TSIZE];
    int rating;
    struct film * next; /* 指向链表的下一个结构 */
};
char * s_gets(char * st,int n);
int main()
{
    struct film * head = NULL;
    struct film * prev, *current;
    char input[TSIZE];

    /* 收集并存储信息 */
    puts("Enter first movie title: ");
    while (s_gets(input,TSIZE)!= NULL && input[0] != '/0')
           {
               current = (struct film *)malloc(sizeof (struct film));
               if(head == NULL)  /* 第一个结构*/
                    head = current;
                else
                    prev->next = current;
                current ->next = NULL;
                strcpy(current ->title,input);
                puts("Enter your rating <0-10>: ");
                scanf("%d",&current->rating);
                while(getchar() != '\n')
                    continue;
                puts("Enter next movie title (empty line to stop):");
                prev = current;
           }

    /* 显示电影列表 */
    if(head == NULL)
        printf("No data entered");
    else
        printf("Here is the movie list:\n");
    current = head;
    while(current != NULL)
    {
        printf("Movie: %s Rating :%d\n",
               current->title,current->rating);
        current = current->next;
    }
    /* 完成任务,释放已分配的内存 */
    current = head;
    while(current != NULL)
    {
        current = head;
        head = current->next;
        free(current);
    }
    printf("Bye\n");

    return 0;
}

char * s_gets(char * st,int n)
{
    char * ret_val;
    char * find;

    ret_val = fgets(st,n,stdin);
    if (ret_val)
    {
        find = strchr(st,'\n'); //查找换行符
        if(find)                //如果地址不是 NULL
            *find = '\0';       //才此处放置一个空字符
        else
            while(getchar() != '\n')
                continue;       //处理剩余数入行
    }
    return ret_val;
}


代码要求输入 电影 以及 rate  然后 empty line to stop  可是 却停不下来 怎么回事
求看看代码在运行过程中哪里导致的
图片附件: 游客没有浏览图片的权限,请 登录注册

2017-04-25 20:44
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
输入空行结束。
C primer plus的字符串处理程序特别喜欢这么干。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-25 20:49
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
  while (s_gets(input,TSIZE)!= NULL && input[0] != '/0')
           

这一行,应该是input[0] !='\0';

反斜杠写成了斜杠。

这种错误,你的编译器没发出warning警告吗?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-25 20:51
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
程序代码:
    while(current != NULL)
    {
        current = head;
        head = current->next;
        free(current);
    }


这里写反了,应该是:
程序代码:
    while(current != NULL)
    {
        head = current->next;
        free(current);
        current = head;
    }

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-25 21:01
qq200258
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-10-29
收藏
得分:0 
回复 4楼 renkejun1942
谢谢 可以了 最后free那部分是书的错误吗?
2017-04-25 21:27
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 5楼 qq200258
要么是你抄错了,要么就是书上的错误,也有可能是译本出错,也有可能是原版就是错的。
这些小错误,没必要纠结,学会看编译信息Debug,比揪着这些小错误更重要。

free那部分编译器不会发出警告信息,但是运行时会出现内存错误,非法访问。看下自己的程序,轻易就能找到问题在哪儿,毕竟就是一些小程序。

[此贴子已经被作者于2017-4-25 21:34编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-25 21:29
qq200258
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-10-29
收藏
得分:0 
回复 6楼 renkejun1942
你好 我还想问问 程序里面的 prev指针 在程序中充当什么  我刚刚学链表 请多指教
2017-04-26 19:35
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 7楼 qq200258
这本书我没看到链表这块儿,我就看到讲位操作那里,而且就看了个开头。
所以我也是第一次看到这本书里的链表代码。
说实话,写的很糟糕。

好久不写注释了,都不知道怎么写了。

程序代码:
    while (s_gets(input,TSIZE)!= NULL && input[0] != '/0')
           {
               current = (struct film *)malloc(sizeof (struct film));
               if(head == NULL)  /* 第一个结构*/
                    head = current;
                else
                    prev->next = current;
                current ->next = NULL;
                strcpy(current ->title,input);
                puts("Enter your rating <0-10>: ");
                scanf("%d",&current->rating);
                while(getchar() != '\n')
                    continue;
                puts("Enter next movie title (empty line to stop):");
                prev = current;
           }


这一堆代码,你将多余的不属于链表操作的去掉应该会更容易理解:
程序代码:
    while (s_gets(input,TSIZE)!= NULL && input[0] != '/0')
           {
               current = (struct film *)malloc(sizeof (struct film));
               if(head == NULL)  //如果head等于NULL,则表示是空链表
                    head = current;//让head指向新的节点current
                else
                    prev->next = current;//否则,让prev->next链接current
                current ->next = NULL;//current->next赋值为NULL。
                prev = current;//prev指向新的节点,也就是说prev随着节点的增加而同步前进。
           }



[此贴子已经被作者于2017-4-26 19:46编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-26 19:44
qq200258
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-10-29
收藏
得分:0 
回复 8楼 renkejun1942
那 current 和 prev 到底是什么意思呢 我想了好久都转不过来

[此贴子已经被作者于2017-4-26 20:20编辑过]

2017-04-26 20:16
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 9楼 qq200258
字面意思。
这些代码的变量名都直接告诉你了它的作用。
current 当前
prev 前一个。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-26 20:21
快速回复:C primer plus上的一个链表示例代码
数据加载中...
 
   



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

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