C 语言 实现 List

list.h

cpp 复制代码
#ifndef LIST_H_
#define LIST_H_

#include <stdbool.h>

#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;

void InitializeList(List *plist);

bool ListIsEmpty(const List *plist);
bool ListIsFull(const List *plist);
unsigned int ListItemCount(const List *plist);
bool AddItem(Item item, List *plist);
void Traverse(const List *plist, void(*pfun)(Item item));
void EmptyTheList(List *plist);




#endif

list.c

cpp 复制代码
#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;
}

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) *plist = pnew;
    else
    {
        while(scan->next != NULL)
        {
            scan = scan->next;
        }
        scan->next = pnew;
    }

    return true;
}

void Traverse(const List *plist, void(*pfun)(Item item))
{
    Node *pnode = *plist;
    while(pnode != NULL)
    {
        (*pfun)(pnode->item);
        pnode = pnode->next;
    }
}

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;
}

main.c

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include <string.h>
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, "No memory available! Bye!\n");
        exit(1);
    }

    puts("Enter first movie title: ");
    while(s_gets(temp.title, TSIZE) != NULL && temp.title[0] != '\0')
    {
        puts("Enter your rating <0-10>: ");
        scanf("%d", &temp.rating);
        while(getchar() != '\n')
        {
            continue;
        }

        if(AddItem(temp, &movies) == false)
        {
            fprintf(stderr, "Problem allocating memory\n");
            break;
        }

        if(ListIsFull(&movies))
        {
            puts("The list is now full.");
            break;
        }
        puts("Enter next movie title (empty line to stop): ");
    }

    if(ListIsEmpty(&movies))
    {
        printf("No data entered. ");
    }
    else
    {
        printf("Here is the movie list: \n");
        Traverse(&movies, showmovies);
    }

    printf("You entered %d movies.\n", ListItemCount(&movies));

    EmptyTheList(&movies);
    printf("Bye!\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;
    char *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;
}
相关推荐
程序员大雄学编程1 分钟前
「用Python来学微积分」18. 微分
开发语言·python·数学·微积分
我命由我1234525 分钟前
PDFBox - PDF 页面坐标系、PDF 页面尺寸获取、PDF 页面位置计算
java·服务器·开发语言·笔记·后端·java-ee·pdf
小苏兮30 分钟前
【数据结构】二叉搜索树
开发语言·数据结构·c++·学习·1024程序员节
ᐇ95933 分钟前
Java 程序运行原理与内存模型解析
java·开发语言
ai安歌39 分钟前
【Rust编程:从新手到大师】 Rust 控制流深度详解
开发语言·算法·rust
czhc11400756631 小时前
JAVA1027抽象类;抽象类继承
android·java·开发语言
练习时长一年1 小时前
jdk动态代理的实现原理
java·开发语言
无限进步_1 小时前
深入理解C语言scanf函数:从基础到高级用法完全指南
c语言·开发语言·c++·后端·算法·visual studio
Wild_Pointer.1 小时前
Qt Creator:避免QRunnable和QObject多重继承
开发语言·qt
三无少女指南1 小时前
关于JVM调优,我想聊聊数据和耐心
java·开发语言·jvm