首页 > 编程语言 >让程序既能正序也能逆序显示电影列表。使用双向链表

让程序既能正序也能逆序显示电影列表。使用双向链表

时间:2024-08-12 23:29:36浏览次数:7  
标签:current 正序 title Movie list 链表 printf MovieList 逆序

/让程序既能正序也能逆序显示电影列表。使用双向链表/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Movie
{
    char title[100];
    struct Movie *prev;
    struct Movie *next;
} Movie;

typedef struct MovieList
{
    Movie *head;
    Movie *tail;
} MovieList;

void initMovieList(MovieList *list)
{
    list->head = NULL;
    list->tail = NULL;
}

void addMovie(MovieList *list, const char *title)
{
    Movie *newMovie = (Movie *)malloc(sizeof(Movie));
    strcpy(newMovie->title, title);
    newMovie->prev = list->tail;
    newMovie->next = NULL;

    if (list->tail)
    {
        list->tail->next = newMovie;
    }
    else
    {
        list->head = newMovie;
    }

    list->tail = newMovie;
}

void displayMoviesForward(MovieList *list)
{
    Movie *current = list->head;
    printf("电影列表(正序):\n");
    while (current)
    {
        printf("%s\n", current->title);
        current = current->next;
    }
}

void displayMoviesBackward(MovieList *list)
{
    Movie *current = list->tail;
    printf("电影列表(逆序):\n");
    while (current)
    {
        printf("%s\n", current->title);
        current = current->prev;
    }
}
void freeMovieList(MovieList *list)
{
    Movie *current = list->head;
    while (current)
    {
        Movie *temp = current;
        current = current->next;
        free(temp);
    }
}
int main()
{
    MovieList movieList;
    initMovieList(&movieList);
    int choice;
    char title[100];
    do
    {
        printf("1. 添加电影\n");
        printf("2. 显示电影(正序)\n");
        printf("3. 显示电影(逆序)\n");
        printf("0. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        getchar(); 
        switch (choice)
        {
        case 1:
            printf("请输入电影名称: ");
            fgets(title, sizeof(title), stdin);
            title[strcspn(title, "\n")] = 0;
            addMovie(&movieList, title);
            break;
        case 2:
            displayMoviesForward(&movieList);
            break;
        case 3:
            displayMoviesBackward(&movieList);
            break;
        case 0:
            printf("退出程序。\n");
            break;
        default:
            printf("无效选择,请重新输入。\n");
            break;
        }
    } while (choice != 0);
    freeMovieList(&movieList);
    return 0;
}

标签:current,正序,title,Movie,list,链表,printf,MovieList,逆序
From: https://www.cnblogs.com/yesiming/p/18355918

相关文章

  • 逆序对数列(P2513) - 题解
    [HAOI2009]逆序对数列原题链接题目描述对于一个数列\(\{a_i\}\),如果有\(i<j\)且\(a_i>a_j\),那么我们称\(a_i\)与\(a_j\)为一对逆序对数。若对于任意一个由\(1\simn\)自然数组成的数列,可以很容易求出有多少个逆序对数。那么逆序对数为\(k\)的这样自然数数列到底......
  • 单链表与双链表的代码实现
    单链表链表的概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表比数组的优势在于,它可以提供高效的重排数据的能力。这种灵活性的代价是不能快速访问表中的任意数据项,访问链表中数据项的唯一方式是沿着链表,一个......
  • C++提高编程—4、STL常用容器—list(链表)和queue(队列)
    7list容器 7.1基本概念 7.2 构造函数 7.3 赋值和交换 7.4 大小操作  使用10000来填充。7.5 插入与删除 7.6 数据存取 7.7 反转与排序  8set/multset容器 7.1基本概念7.2 构造和赋值7.3大小和交换7.4 插入与删除7.5 查......
  • 链表
    1.概念链表是数据结构中的一种,其中的数据是呈线性排列的,第一个数据会指向第二个数据,第二个数据指向第三个数据....单向链表2.操作添加只需要断掉原来的链接,然后建立新的链接即可删除断掉原来的链接,原来的数据不需要处理,后续有新数据存储,直接覆盖即可查找3.......
  • 单向链表 - OJ
    题目一:删除链表中等于给定值val的所有节点。 203.移除链表元素-力扣(LeetCode)【思路】:可以先想想只删除一个val怎么删的。publicListNoderemoveElements(ListNodehead,intval){//链表为空if(head==null){returnhead;......
  • 数据结构之线性表(单链表的实现)
    目录一、单链表的原理二、单链表的实现1.单链表的定义2.单链表的初始化3.清空单链表4.单链表是否为空5.单链表的长度6.获取指定位置i的元素7.获取指定元素e的位置  8.向链表中插入指定位置的元素9.向链表中删除指定位置的元素10.遍历链表中的元素三、打印测......
  • 线性表——双链表
    在Java中,双链表(DoublyLinkedList)是一种常见的数据结构,它允许从两端进行元素的插入和删除操作。与单链表相比,双链表的每个节点除了存储数据本身外,还包含两个指针:一个指向前一个节点(prev),另一个指向后一个节点(next)。这使得双链表在遍历、插入和删除操作上更加灵活。双链表提供......
  • Leetcode 206. 反转链表
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示: 链表中节点的数目范围是 [0,5000]-5000<=Node.val<=5000方法一: //双指......
  • 字符串逆序(递归实现)
    题目内容: 编写一个函数reverse_string(char*string)(逆序实现) 实现:将参数字符串中的字符反向排列,不是逆序打印。 要求:不能使用C函数库中的字符串操作函数 比如:char[]="abcdef"   逆序之后是数组内容变成:"fedcba";非函数:#include<stdio.h>intmain(){ ch......
  • 单链表的增删查改
    头文件#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<assert.h>typedefstructMyStruct{   intdata;   structMyStruct*next;}SL;voidlistprint(SL**phead);//打印链表voidlistpushback(SL**phead,intx);/......