设计多级菜单的数据结构(C语言实现)

题目

参考手机设置菜单,设计多级菜单的数据结构,并将菜单内容打印出来。例如:
|[菜单1]
|–[菜单11]
|–|–(选项a)
|–I–(选项b)
|–[菜单12]
|–|–[菜单121]
|–I–|–(选项c)
|–|–|–(选项d)
|[菜单2]

代码

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

// 菜单项结构体
typedef struct MenuItem {
    char label[50];  
    struct MenuItem *next; 
    struct MenuItem *subMenu; 
} MenuItem;

// 创建新的菜单项
MenuItem* createMenuItem(const char *label) {
    MenuItem *newItem = (MenuItem*)malloc(sizeof(MenuItem));
    strcpy(newItem->label, label);
    newItem->next = NULL;
    newItem->subMenu = NULL;
    return newItem;
}

// 向菜单添加子菜单项
void addSubMenu(MenuItem *menu, MenuItem *subItem) {
    if (menu->subMenu == NULL) {
        menu->subMenu = subItem;
    } else {
        MenuItem *temp = menu->subMenu;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = subItem;
    }
}

// 打印菜单的递归函数
void printMenu(MenuItem *menu, int level) {
    // 打印菜单项的标签
    for (int i = 0; i < level; ++i) {
        printf("|--");
    }
    printf("[%s]\n", menu->label);

    // 打印子菜单
    if (menu->subMenu != NULL) {
        printMenu(menu->subMenu, level + 1);
    }

    // 打印同级菜单项
    if (menu->next != NULL) {
        printMenu(menu->next, level);
    }
}

int main() {
    // 创建菜单
    MenuItem *menu1 = createMenuItem("菜单1");
    MenuItem *menu11 = createMenuItem("菜单11");
    MenuItem *optionA = createMenuItem("选项a");
    MenuItem *optionB = createMenuItem("选项b");
    MenuItem *menu12 = createMenuItem("菜单12");
    MenuItem *menu121 = createMenuItem("菜单121");
    MenuItem *optionC = createMenuItem("选项c");
    MenuItem *optionD = createMenuItem("选项d");
    MenuItem *menu2 = createMenuItem("菜单2");

    // 构建菜单结构
    addSubMenu(menu1, menu11);
    addSubMenu(menu11, optionA);
    optionA->next = optionB;
    addSubMenu(menu1, menu12);
    addSubMenu(menu12, menu121);
    addSubMenu(menu121, optionC);
    optionC->next = optionD;

    // 打印菜单
    printMenu(menu1, 0);
    printMenu(menu2, 0);

    // 释放内存
    free(menu1);
    free(menu11);
    free(optionA);
    free(optionB);
    free(menu12);
    free(menu121);
    free(optionC);
    free(optionD);
    free(menu2);

    return 0;
}

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
双向链表多级菜单设计是一种常见的数据结构算法应用,可以用于实现多级菜单设计。在C语言中,可以通过定义结构体和使用指针来实现双向链表的设计。 首先,我们需要定义一个双向链表节点的结构体,包含菜单项的名称、指向上一级菜单的指针、指向下一级菜单的指针以及指向子菜单的指针。例如: ```c typedef struct MenuItem { char name[50]; struct MenuItem* prev; struct MenuItem* next; struct MenuItem* child; } MenuItem; ``` 接下来,我们可以编写一些函数来实现双向链表多级菜单的操作,包括创建菜单项、添加子菜单、添加兄弟菜单等。以下是一个简单的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> MenuItem* createMenuItem(const char* name) { MenuItem* item = (MenuItem*)malloc(sizeof(MenuItem)); strcpy(item->name, name); item->prev = NULL; item->next = NULL; item->child = NULL; return item; } void addChild(MenuItem* parent, MenuItem* child) { if (parent->child == NULL) { parent->child = child; child->prev = NULL; child->next = NULL; } else { MenuItem* lastChild = parent->child; while (lastChild->next != NULL) { lastChild = lastChild->next; } lastChild->next = child; child->prev = lastChild; child->next = NULL; } } void addSibling(MenuItem* sibling, MenuItem* newSibling) { sibling->next = newSibling; newSibling->prev = sibling; newSibling->next = NULL; } void printMenu(MenuItem* menu) { MenuItem* currentItem = menu; while (currentItem != NULL) { printf("%s\n", currentItem->name); if (currentItem->child != NULL) { printMenu(currentItem->child); } currentItem = currentItem->next; } } int main() { MenuItem* menu = createMenuItem("Menu"); MenuItem* item1 = createMenuItem("Item 1"); MenuItem* item2 = createMenuItem("Item 2"); MenuItem* item3 = createMenuItem("Item 3"); addChild(menu, item1); addChild(menu, item2); addChild(menu, item3); MenuItem* subItem1 = createMenuItem("Sub Item 1"); MenuItem* subItem2 = createMenuItem("Sub Item 2"); addChild(item1, subItem1); addChild(item1, subItem2); MenuItem* siblingItem = createMenuItem("Sibling Item"); addSibling(item3, siblingItem); printMenu(menu); return 0; } ``` 上述代码中,我们首先创建了一个名为"Menu"的菜单项,然后创建了三个子菜单项"Item 1"、"Item 2"和"Item 3",并将它们添加到"Menu"菜单项中。接着,我们创建了两个子菜单项"Sub Item 1"和"Sub Item 2",并将它们添加到"Item 1"菜单项中。最后,我们创建了一个兄弟菜单项"Sibling Item",并将它添加到"Item 3"菜单项后面。 通过调用printMenu函数,我们可以打印出整个菜单的结构。 希望以上内容能够帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值