| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3948 人关注过本帖, 1 人收藏
标题:书上的代码 链表存储抽象数据类型,VS2017编译通过,输入一个项目后再输入 ...
取消只看楼主 加入收藏
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
结帖率:33.33%
收藏(1)
已结贴  问题点数:20 回复次数:10 
书上的代码 链表存储抽象数据类型,VS2017编译通过,输入一个项目后再输入第二个项目列表出错
[附件]1[/附件]
//list.c 实现函数文件
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include"list.h"


//局部函数原型
static void CopyToNode(Item item, Node * pnode);

//接口函数
//把列表设置为空列表
void InitializeList(List * plist)
{
    *plist = NULL;
}

//如果列表为空则返回真
bool ListIsEmpty(const List *plist)
{
    if (*plist == NULL)
        return true;
    else
        return false;
}

//如果列表已满则返回真
bool ListIsFull(const List * plist)
{
    Node * pt;
    bool full;

    pt = (Node *)malloc(sizeof(Node));
    if (pt == NULL)
        full = true;
    else
        full = false;
    free(pt);
    return full;

}

//返回节点数
unsigned int ListItemCount(const List * plist)
{
    unsigned int count = 0;
    Node * pnode = *plist; //指向列表的开始

    while (pnode != NULL)
    {
        ++count;
        pnode = pnode->next;//指向下一个节点
    }
    return count;
}

//创建存放项目的节点,并把它添加到由plist指向的列表尾部
bool AddItem(Item item, List * plist)
{
    Node * pnew;
    Node * scan = *plist;

    pnew = (Node *)malloc(sizeof(Node));
    if (pnew = NULL)
        return false;//失败时推出函数

    CopyToNode(item,pnew);
    pnew->next = NULL;
    if (scan == NULL)      //空列表,把pnew放在列表头部
        * plist = pnew;
    else
    {
        while (scan->next != NULL)
            scan = scan->next;
        scan->next = pnew;    //寻找尾节点,添加pnew指针
    }
    return true;
}


//访问每个节点并分别执行pfun指向的函数
void Traverse(const List * plist, void(*pfun)(Item item))
{
    Node * pnode = *plist; // 设置到列表的开始处

    while (pnode != NULL)
    {
        (*pfun)(pnode->item);  //把函数作用于列表中的项目
        pnode = pnode->next;  //前进到下一项
    }

}


//释放由malloc()分配的内存
//把列表指针设置为NULL
void EmptyTheList(List * plist)
{
    Node * psave;
    while (*plist != NULL)
    {
        psave = (*plist)->next; //保存下一节点的地址
        free(*plist);      //释放当前节点
        *plist = psave;    //前进到下一个节点
    }
}

//局部函数定义
//把一个项目复制到一个节点中
static void CopyToNode(Item item, Node * pnode)
{
    pnode->item = item;     //结构复制
}



// films3.cpp : 定义控制台应用程序的入口点。
//使用ADT风格的链表
//和list.c一同编译
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//提供exit()原型
#include"list.h"   //定义List,Item
void showmovies(Item item);
char * s_gets(char * st, int n);

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

    //初始化
    InitializeList(&movies);
    if (ListIsFull(&movies))
    {
        fprintf(stderr,"没有足够内存");
        exit(1);
    }

    //收集并存储数据
    puts("Enter first movie title: ");
    while (s_gets(temp.title,TSIZE) != NULL && temp.title[0] != '\0')
    {
        puts("enter your tating<0-10>");
        scanf("%d",&temp.rating);
        while (getchar() != '\n')
            continue;
        if (AddItem(temp, &movies) == false)
        {
            fprintf(stderr,"内存出问题");
            break;
        }
        if (ListIsFull(&movies))
        {
            puts("列表满");
            break;
        }
        puts("enter next movie title (empty line to stop): ");
    }

    //显示
    if (ListIsEmpty(&movies))
        printf("无数据输入 \n");
    else
    {
        printf("here is the movie list: \n");
        Traverse(&movies,showmovies);
    }
    printf("you enterd %d  movies,\n",ListItemCount(&movies));

    //清除
    EmptyTheList(&movies);
    printf("再见!\n");

    return 0;
}


void showmovies(Item item)
{
    printf("Movie:%s Rating: %d\n",item.title,item.rating);

}

char * s_gets(char * st, int n)
{
    char * ret_val, *find;
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');
        if (find)
            *find = '\0';
        else
            while (getchar() != '\n')
                continue;
    }
    return ret_val;
}


//list.h头文件
#pragma once
#ifndef LIST_H_
#define LIST_H_
#include<stdbool.h>  //C99特性

//特定于程序的声明
#define TSIZE 45  //存放片名的数组大小
struct film
{
    char title[TSIZE];
    int rating;
};

//一般类型定义
typedef struct film Item;

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


typedef Node * List;
//初始化列表,plist指向一个列表
void InitializeList(List * plist);

//确定列表是否为空列表
//plist指向一个已初始化的列表
//如果该列表为空则返回true,否则返回false
bool ListIsEmpty(const List * plist);

//确定列表是否已满
//操作前:plist指向一个已初始化的列表
//操作后:如果该列表已满则返回true;否则返回false

bool ListIsFull(const List * plist);

//操作:确定列表中项目个数
//plist指向一个已初始化列表
//操作后:返回该列表中项目的个数

unsigned int ListItemCount(const List * plist);

//操作:在列表尾部添加一个项目
//操作前:item是要被增加到列表中的项目
  //        plist指向一个已初始化的列表
//操作后:如果可能的话,在列表尾部添加一个新项目
//函数返回true,否则函数返回false
bool AddItem(Item item,List * plist);

//操作:把一个函数作用于列表中的每一个项目
//操作前:plist指向一个已初始化的列表
//       pfun指向一个函数,该函数接受一个
//Item参数并且无返回值
//操作后:pfun指向的函数被作用到列表中每个项目一次
void Traverse(const List * plist,void(* pfun)(Item item));

//释放已分配的内存(如果有)
//操作前:plist指向一个已初始化的列表
//操作后:为该列表分配的内存已被释放
//并且该列表被置为空列表

void EmptyTheList(List * plist);

#endif
搜索更多相关主题的帖子: 项目 列表 list Node Item 
2017-07-04 22:21
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-07-04 22:22
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

这是编译通过的窗口,输入struct film结构数据项目一次后,再输入第二次struct film结构数据项目报错如上图
2017-07-04 22:29
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
哪位在你的编译器上运行下是不是报错,我猜vs2017c++有些功能不兼容c
2017-07-04 22:46
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
适合啊,struct film
{
    char title[TSIZE];
    int rating;
};

//一般类型定义
typedef struct film Item;
2017-07-04 22:48
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
蓝色字体内有定义,是一般类型
2017-07-04 22:49
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
回复 8楼 九转星河
好的谢谢了
2017-07-04 22:58
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
回复 10楼 九转星河
试试用
enum bool{false,true};
代替#include<stdbool.h>那一行
2017-07-04 23:07
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
回复 10楼 九转星河
开辟一个Node项目内存空间,地址给pnew,失败说明内存已满,返回失败。
2017-07-05 11:37
gongsan
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-7-4
收藏
得分:0 
问题就出在输入进去的数据,复制不进去项目节点
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-07-05 11:42
快速回复:书上的代码 链表存储抽象数据类型,VS2017编译通过,输入一个项目后再 ...
数据加载中...
 
   



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

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