#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
// 设计用户节点
struct user
{
int account;
char password[6];
struct user *next;
};
// 初始化用户链表
struct user *init_user()
{
struct user *u = malloc(sizeof(struct user));
if (u == NULL)
{
printf("u malloc fail\n");
return NULL;
}
u->account = 0;
memset(u->password, 0, sizeof(u->password));
u->next = NULL;
}
// 注册
void reg(struct user *u)
{
struct user *un = malloc(sizeof(struct user));
if (un == NULL)
{
printf("un malloc fail\n");
return;
}
printf("请输入11位整数账号:\n");
scanf("%d", &un->account);
printf("请输入6位密码:\n");
scanf("%s", un->password);
// 头插
un->next = u->next;
u->next = un;
printf("\n注册成功!\n");
}
// 普通用户登录
int login(struct user *u)
{
int account;
char password[6];
printf("请输入11位整数账号:\n");
scanf("%d", &account);
printf("请输入6位密码:\n");
scanf("%s", password);
struct user *p;
for (p = u->next; p != NULL; p = p->next)
{
if (p->account == account)
{
if (strcmp(p->password, password) == 0)
{
printf("\n登录成功!\n");
return 1;
}
else
{
printf("\n密码输入错误!\n");
return 0;
}
}
}
printf("\n用户名不存在,请先注册!\n");
}
// 管理员登录
int admin_login()
{
while (1)
{
int account;
char password[6];
printf("请输入8位整数账号:\n");
scanf("%d", &account);
printf("请输入6位密码:\n");
scanf("%s", password);
if (account == 88888888)
{
if (strcmp("123456", password) == 0)
{
printf("登录成功!\n");
return 1;
}
else
{
printf("密码输入错误!\n");
}
}
printf("用户名输入错误!\n");
}
}
// 设计食物的节点
struct food
{
char food_name[50]; // 食物名字
int price; // 价格
struct food *next; // 后继指针
struct food *prev; // 前驱指针
};
// 设计菜单节点
struct menu
{
int num; // 序号
char menu_name[50]; // 菜单名字
struct food *f_head; // 指向食物链表头的节点
struct menu *next; // 后继指针
struct menu *prev; // 前驱指针
};
// 初始化食物节点
struct food *init_food()
{
struct food *f_head = malloc(sizeof(struct food));
if (f_head == NULL)
{
printf("f_head malloc fail\n");
return NULL;
}
memset(f_head->food_name, 0, sizeof(f_head->food_name));
f_head->price = 0;
f_head->next = f_head;
f_head->prev = f_head;
return f_head;
}
// 初始化菜单节点
struct menu *init_menu()
{
struct menu *m_head = malloc(sizeof(struct menu));
if (m_head == NULL)
{
printf("m_head malloc fail\n");
return NULL;
}
m_head->num = 0;
bzero(m_head->menu_name, 50);
m_head->f_head = NULL;
m_head->next = m_head;
m_head->prev = m_head;
return m_head;
}
// 食物头插
void insert_food_head(struct food *f_head, int food_num)
{
for (int i = 0; i < food_num; i++)
{
struct food *new_f = malloc(sizeof(struct food));
if (new_f == NULL)
{
printf("new_f malloc fail\n");
return;
}
char foodname[50];
printf("please input foodname\n");
scanf("%s", foodname);
strcpy(new_f->food_name, foodname);
int price;
printf("please input foodprice\n");
scanf("%d", &price);
new_f->price = price;
new_f->next = f_head->next;
new_f->prev = f_head;
f_head->next->prev = new_f;
f_head->next = new_f;
}
}
// 菜单头插
void insert_menu_head(struct menu *m_head, struct food *f_head)
{
struct menu *new_m = malloc(sizeof(struct menu));
if (new_m == NULL)
{
printf("new_m malloc fail\n");
return;
}
// 初始化节点
int num;
printf("please input menunum\n");
scanf("%d", &num);
new_m->num = num;
char menuname[50];
printf("please input menuname\n");
scanf("%s", menuname);
strcpy(new_m->menu_name, menuname);
new_m->f_head = f_head;
new_m->next = m_head->next;
new_m->prev = m_head;
m_head->next->prev = new_m;
m_head->next = new_m;
}
// 食物头插
void insert_food_head1(struct food *f_head, char foodname[50], int price)
{
struct food *new_f = malloc(sizeof(struct food));
if (new_f == NULL)
{
printf("new_f malloc fail\n");
return;
}
strcpy(new_f->food_name, foodname);
new_f->price = price;
new_f->next = f_head->next;
new_f->prev = f_head;
f_head->next->prev = new_f;
f_head->next = new_f;
}
// 菜单头插
void insert_menu_head1(struct menu *m_head, struct food *f_head, int num, char menuname[50])
{
struct menu *new_m = malloc(sizeof(struct menu));
if (new_m == NULL)
{
printf("new_m malloc fail\n");
return;
}
// 初始化节点
new_m->num = num;
strcpy(new_m->menu_name, menuname);
new_m->f_head = f_head;
new_m->next = m_head->next;
new_m->prev = m_head;
m_head->next->prev = new_m;
m_head->next = new_m;
}
#if 1
// 食物尾插
void insert_food_tail(struct food *f_head, int food_num)
{
for (int i = 0; i < food_num; i++)
{
struct food *new_f = malloc(sizeof(struct food));
if (new_f == NULL)
{
printf("new_f malloc fail\n");
return;
}
char foodname[50];
printf("please input foodname\n");
scanf("%s", foodname);
strcpy(new_f->food_name, foodname);
int price;
printf("please input foodprice\n");
scanf("%d", &price);
new_f->price = price;
// 不用分情况
new_f->next = f_head;
new_f->prev = f_head->next;
f_head->prev->next = new_f;
f_head->prev = new_f;
}
}
// 菜单尾插
void insert_menu_tail(struct menu *m_head, struct food *f_head)
{
struct menu *new_m = malloc(sizeof(struct menu));
if (new_m == NULL)
{
printf("new_m malloc fail\n");
return;
}
// 初始化节点
int num;
printf("please input menunum\n");
scanf("%d", &num);
new_m->num = num;
char menuname[50];
printf("please input menuname\n");
scanf("%s", menuname);
strcpy(new_m->menu_name, menuname);
new_m->f_head = f_head;
// 不用分情况
new_m->next = m_head;
new_m->prev = m_head->prev;
m_head->prev->next = new_m;
m_head->prev = new_m;
}
#else
// 食物尾插
void insert_food_tail(struct food *f_head, char foodname[50], int price)
{
struct food *new_f = malloc(sizeof(struct food));
if (new_f == NULL)
{
printf("new_f malloc fail\n");
return;
}
strcpy(new_f->food_name, foodname);
new_f->price = price;
new_f->next = f_head;
new_f->prev = f_head->next;
f_head->prev->next = new_f;
f_head->prev = new_f;
}
// 菜单尾插
void insert_menu_tail(struct menu *m_head, struct food *f_head, int num, char menuname[50])
{
struct menu *new_m = malloc(sizeof(struct menu));
if (new_m == NULL)
{
printf("new_m malloc fail\n");
return;
}
// 初始化节点
new_m->num = num;
strcpy(new_m->menu_name, menuname);
new_m->f_head = f_head;
new_m->next = m_head;
new_m->prev = m_head->prev;
m_head->prev->next = new_m;
m_head->prev = new_m;
}
#endif
// 食物遍历
void dispaly_food(struct food *f_head)
{
if (f_head->next == f_head)
{
printf("food null\n");
return;
}
struct food *p;
for (p = f_head->next; p != f_head; p = p->next)
{
printf("│食物名字:[%-s]\n", p->food_name);
printf("│食物价格:[%-d]\n", p->price);
}
printf("╰───────────────────────╯\n");
}
// 菜单和食物遍历
void display(struct menu *m_head)
{
if (m_head->next == m_head)
{
printf("menu null\n");
return;
}
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
printf("╭───────────────────────╮\n");
printf("│菜单编号:[%-d]\n", p->num);
printf("│菜单名字:[%-s]\n", p->menu_name);
printf("│\n");
printf("│\n");
dispaly_food(p->f_head);
}
}
// 释放食物链表
void release_food(struct food *f_head)
{
// 只有头结点
if (f_head->next == f_head)
{
printf("food null\n");
free(f_head);
return;
}
// 多个节点
struct food *tmp, *p;
for (p = f_head->next; p != f_head;)
{
tmp = p;
p = p->next;
free(tmp);
}
free(f_head);
}
// 释放菜单和食物链表
void release_menu(struct menu *m_head)
{
// 只有头结点
if (m_head == NULL)
{
return;
}
// 多个节点
struct menu *tmp, *p;
for (p = m_head->next; p != m_head;)
{
tmp = p;
p = p->next;
release_food(tmp->f_head);
free(tmp);
}
m_head->next = m_head;
m_head->prev = m_head;
}
// 头删菜单
void delete_menu_head(struct menu *m_head)
{
// 空
if (m_head->next == m_head)
{
printf("menu null\n");
free(m_head->next);
return;
}
// 只有一个节点
struct menu *p;
if (m_head->next->next == m_head)
{
p = m_head->next;
m_head->next = m_head;
m_head->prev = m_head;
release_food(p->f_head);
free(p);
}
// 多个节点
p = m_head->next;
p->next->prev = m_head;
m_head->next = p->next;
release_food(p->f_head);
free(p);
}
// 尾删菜单
void delete_menu_tail(struct menu *m_head)
{
// 空
if (m_head->next == m_head)
{
printf("menu null\n");
free(m_head->next);
return;
}
// 只有一个节点
struct menu *p;
if (m_head->prev->prev == m_head)
{
p = m_head->prev;
m_head->next = m_head;
m_head->prev = m_head;
release_food(p->f_head);
free(p);
}
// 多个节点
p = m_head->prev;
p->prev->next = m_head;
m_head->prev = p->prev;
release_food(p->f_head);
free(p);
}
// 根据序号查找菜单
void find_menu_num(struct menu *m_head, int num)
{
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
if (p->num == num)
{
printf("╭───────────────────────╮\n");
printf("│菜单序号:[%d]\n", p->num);
printf("│菜单名字:[%s]\n", p->menu_name);
printf("│\n");
printf("│\n");
dispaly_food(p->f_head);
return;
}
}
printf("\n没有找到菜单\n");
}
// 根据名字查找菜单
void find_menu_name(struct menu *m_head, char menu_name[50])
{
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
if (strcmp(p->menu_name, menu_name) == 0)
{
printf("╭───────────────────────╮\n");
printf("│菜单序号:[%d]\n", p->num);
printf("│菜单名字:[%s]\n", p->menu_name);
printf("│\n");
printf("│\n");
dispaly_food(p->f_head);
return;
}
}
printf("\n没有找到菜单\n");
}
// 修改food
void change_food(struct food *f_head)
{
struct food *q;
for (q = f_head->next; q != f_head; q = q->next)
{
printf("please input change foodname:\n");
scanf("%s", q->food_name);
printf("please input change foodprice:\n");
scanf("%d", &q->price);
}
}
// 根据序号修改菜单
void change_menu_num(struct menu *m_head, int num)
{
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
if (p->num == num)
{
printf("please input change menunum:\n");
scanf("%d", &p->num);
printf("please input change menuname:\n");
scanf("%s", p->menu_name);
change_food(p->f_head);
}
}
}
// 根据名字修改菜单
void change_menu_name(struct menu *m_head, char menu_name[50])
{
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
if (strcmp(p->menu_name, menu_name) == 0)
{
printf("please input change menunum:\n");
scanf("%d", &p->num);
printf("please input change menuname:\n");
scanf("%s", p->menu_name);
change_food(p->f_head);
}
}
}
int menu_length(struct menu *m_head)
{
if (m_head->next == m_head)
{
return 0;
}
int length = 0;
struct menu *p;
for (p = m_head->next; p != m_head; p = p->next)
{
length++;
}
return length;
}
// 实现指定位置插入菜单
void insert_menu_at(struct menu *m_head, int pos)
{
if (pos <= 0)
{
printf("无效的位置\n");
return;
}
int length = menu_length(m_head);
if (pos > length + 1)
{
printf("位置超出范围\n");
return;
}
struct menu *new_m = malloc(sizeof(struct menu));
if (new_m == NULL)
{
printf("内存分配失败\n");
return;
}
struct food *new_food_head = init_food();
if (new_food_head == NULL)
{
printf("食物链表初始化失败\n");
free(new_m);
return;
}
printf("请输入要插入的食物数量\n");
int food_num;
scanf("%d", &food_num);
insert_food_head(new_food_head, food_num);
struct menu *p = m_head;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
new_m->next = p->next;
new_m->prev = p;
p->next->prev = new_m;
p->next = new_m;
printf("请输入菜单编号:\n");
scanf("%d", &new_m->num);
printf("请输入菜单名字:\n");
scanf("%s", new_m->menu_name);
new_m->f_head = new_food_head;
}
// 实现指定位置删除菜单
void delete_menu_at(struct menu *m_head, int pos)
{
if (pos <= 0)
{
printf("无效的位置\n");
return;
}
int length = menu_length(m_head);
if (pos > length)
{
printf("位置超出范围\n");
return;
}
struct menu *p = m_head;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
p->prev->next = p->next;
p->next->prev = p->prev;
release_food(p->f_head);
free(p);
printf("删除成功\n");
}
// 实现指定序号删除菜单
void delete_menu_by_num(struct menu *m_head, int num)
{
struct menu *p = m_head->next;
while (p != m_head)
{
if (p->num == num)
{
p->prev->next = p->next;
p->next->prev = p->prev;
release_food(p->f_head);
free(p);
printf("删除成功\n");
return;
}
p = p->next;
}
printf("未找到指定序号的菜单\n");
}
int main(int argc, char **argv)
{
struct user *u = init_user();
if (u == NULL)
{
printf("u init_user fail\n");
return -1;
}
struct menu *m_head = init_menu();
if (m_head == NULL)
{
printf("m_head init_menu fail\n");
return -1;
}
struct food *f_head1 = init_food();
if (f_head1 == NULL)
{
printf("f_head1 init_food fail\n");
return -1;
}
struct food *f_head2 = init_food();
if (f_head2 == NULL)
{
printf("f_head2 init_food fail\n");
return -1;
}
struct food *f_head3 = init_food();
if (f_head3 == NULL)
{
printf("f_head3 init_food fail\n");
return -1;
}
// 原始菜单
insert_food_head1(f_head1, "香辣鸡腿汉堡", 20);
insert_food_head1(f_head1, "可乐", 6);
insert_food_head1(f_head1, "薯条", 12);
insert_food_head1(f_head2, "黑椒鸡块", 12);
insert_food_head1(f_head2, "薯条", 12);
insert_food_head1(f_head2, "鸡腿", 12);
insert_food_head1(f_head3, "沙拉", 15);
insert_food_head1(f_head3, "小蛋糕", 20);
insert_food_head1(f_head3, "年糕", 15);
insert_menu_head1(m_head, f_head1, 3, "超值三件套");
insert_menu_head1(m_head, f_head2, 2, "小吃");
insert_menu_head1(m_head, f_head3, 1, "甜品");
struct food *new_food_head;
struct food *new_food_tail;
int food_num;
int flag = 1;
int flag1 = 1;
int fun;
int fun1;
int fun2;
int fun3;
int num;
char a[50];
while (1)
{
printf("\n===登录菜单===\n");
printf("1. 注册\n");
printf("2. 登录\n");
printf("3. 管理员登录\n");
printf("4. 退出\n");
printf("请选择操作:");
scanf("%d", &fun);
switch (fun)
{
case 1:
reg(u);
break;
case 2:
// 普通用户
if (login(u) == 1)
{
flag = 1;
struct menu *p = m_head;
struct food *q;
while (flag)
{
printf("\n===== 用户菜单 =====\n");
printf("1. 下一个菜单\n");
printf("2. 上一个菜单\n");
printf("3. 进入菜单\n");
printf("4. 根据序号查找菜单\n");
printf("5. 根据名字查找菜单\n");
printf("6. 展示所有菜单\n");
printf("7. 输出菜单个数\n");
printf("8. 退出\n");
printf("请选择操作:");
scanf("%d", &fun1);
switch (fun1)
{
case 1:
if (p->next == m_head) // 如果当前已经是尾节点,则不能再往后翻
{
printf("已经是最后一本\n");
}
else
{
p = p->next;
printf("╭───────────────────────╮\n");
printf("│菜单序号:[%d]\n", p->num);
printf("│菜单名字:[%s]\n", p->menu_name);
printf("│\n");
printf("│\n");
dispaly_food(p->f_head);
}
break;
case 2:
if (p->prev == m_head) // 如果当前已经是尾节点,则不能再往后翻
{
printf("已经是最后一本\n");
}
else
{
p = p->prev;
printf("╭───────────────────────╮\n");
printf("│菜单序号:[%d]\n", p->num);
printf("│菜单名字:[%s]\n", p->menu_name);
printf("│\n");
printf("│\n");
dispaly_food(p->f_head);
}
break;
case 3:
flag1 = 1;
q = p->f_head;
while (flag1)
{
printf("\n===== 菜单食物 =====\n");
printf("1. 下一个食物\n");
printf("2. 上一个食物\n");
printf("3. 购买\n");
printf("4. 退出\n");
printf("请选择操作:");
scanf("%d", &fun3);
switch (fun3)
{
case 1:
if (q->next == p->f_head) // 如果当前已经是尾节点,则不能再往后翻
{
printf("已经是最后一本\n");
}
else
{
q = q->next;
printf("╭───────────────────────╮\n");
printf("│食物名字:[%s]\n", q->food_name);
printf("│\n");
printf("│食物价格:[%d]\n", q->price);
printf("│\n");
printf("╰───────────────────────╯\n");
}
break;
case 2:
if (q->prev == p->f_head) // 如果当前已经是尾节点,则不能再往后翻
{
printf("已经是最后一本\n");
}
else
{
q = q->prev;
printf("╭───────────────────────╮\n");
printf("│食物名字:[%s]\n", q->food_name);
printf("│\n");
printf("│食物价格:[%d]\n", q->price);
printf("│\n");
printf("╰───────────────────────╯\n");
}
break;
case 3:
printf("\n购买成功!\n");
break;
case 4:
flag1 = 0;
break;
default:
printf("error\n");
return -1;
}
}
break;
case 4:
printf("请输入菜单编号:\n");
scanf("%d", &num);
find_menu_num(m_head, num); // 根据序号查找菜单
break;
case 5:
printf("请输入菜单名字:\n");
scanf("%s", a);
find_menu_name(m_head, a); // 根据名字查找菜单
break;
case 6:
display(m_head); // 展示所有菜单
break;
case 7:
printf("\n%d\n", menu_length(m_head)); // 输出菜单个数
break;
case 8:
flag = 0;
break;
default:
printf("error\n");
return -1;
}
}
break;
}
break;
case 3:
// 管理员
if (admin_login() == 1)
{
flag = 1;
while (flag)
{
printf("\n===== 管理员操作菜单 =====\n");
printf("1. 插入菜单\n");
printf("2. 删除菜单\n");
printf("3. 修改菜单\n");
printf("4. 查找菜单\n");
printf("5. 退出\n");
printf("请选择操作:");
scanf("%d", &fun1);
switch (fun1)
{
case 1:
printf("\n----- 插入菜单 -----\n");
printf("1. 在头部插入菜单\n");
printf("2. 在尾部插入菜单\n");
printf("3. 在指定位置插入菜单\n");
printf("4. 退出\n");
printf("请选择操作:");
scanf("%d", &fun2);
switch (fun2)
{
case 1:
// 插入头部
new_food_head = init_food();
if (new_food_head == NULL)
{
printf("new_food_head init fail\n");
break;
}
printf("请输入要插入的食物数量\n");
scanf("%d", &food_num);
insert_food_head(new_food_head, food_num);
insert_menu_head(m_head, new_food_head); // 头插菜单
break;
case 2:
// 插入尾部
new_food_tail = init_food();
if (new_food_tail == NULL)
{
printf("new_food_head init fail\n");
break;
}
printf("请输入要插入的食物数量\n");
scanf("%d", &food_num);
insert_food_tail(new_food_tail, food_num);
insert_menu_tail(m_head, new_food_tail); // 尾插菜单
break;
case 3:
// 指定位置插入
printf("请输入插入位置:\n");
int pos;
scanf("%d", &pos);
insert_menu_at(m_head, pos); // 在指定位置插入
break;
case 4:
break;
default:
break;
}
break;
case 2:
printf("\n----- 删除菜单 -----\n");
printf("1. 在头部删除菜单\n");
printf("2. 在尾部删除菜单\n");
printf("3. 删除指定位置的菜单\n");
printf("4. 删除指定序号的菜单\n");
printf("5. 清空所有菜单\n");
printf("6. 退出\n");
printf("请选择操作:");
scanf("%d", &fun2);
switch (fun2)
{
case 1:
delete_menu_head(m_head); // 头删
break;
case 2:
delete_menu_tail(m_head); // 尾删
break;
case 3:
// 指定位置删除
printf("请输入删除位置:\n");
int pos;
scanf("%d", &pos);
delete_menu_at(m_head, pos); // 指定位置删除
break;
case 4:
// 指定序号删除
printf("请输入删除序号:\n");
int num;
scanf("%d", &num);
delete_menu_by_num(m_head, num); // 指定序号删除
break;
case 5:
release_menu(m_head); // 清空链表
printf("\n菜单已经清空\n");
break;
case 6:
break;
default:
break;
}
break;
case 3:
printf("\n----- 改变菜单 -----\n");
printf("1. 根据序号修改菜单\n");
printf("2. 根据名字修改菜单\n");
printf("3. 退出\n");
printf("请选择操作:");
scanf("%d", &fun2);
switch (fun2)
{
case 1:
printf("请输入菜单编号:\n");
scanf("%d", &num);
change_menu_num(m_head, num); // 根据序号修改菜单
break;
case 2:
printf("请输入菜单名字:\n");
scanf("%s", a);
change_menu_name(m_head, a); // 根据名字修改菜单
break;
case 3:
break;
default:
break;
}
break;
case 4:
printf("\n----- 输出菜单 -----\n");
printf("1. 根据序号查找菜单\n");
printf("2. 根据名字查找菜单\n");
printf("3. 展示所有菜单\n");
printf("4. 输出菜单个数\n");
printf("5. 退出\n");
printf("请选择操作:");
scanf("%d", &fun2);
switch (fun2)
{
case 1:
printf("请输入菜单编号:\n");
scanf("%d", &num);
find_menu_num(m_head, num); // 根据序号查找菜单
break;
case 2:
printf("请输入菜单名字:\n");
scanf("%s", a);
find_menu_name(m_head, a); // 根据名字查找菜单
break;
case 3:
display(m_head); // 展示所有菜单
break;
case 4:
printf("\n%d\n", menu_length(m_head)); // 输出菜单个数
break;
case 5:
break;
default:
break;
}
break;
case 5:
// free_linklist(head); // 释放
flag = 0;
break;
default:
printf("error");
return -1;
}
}
}
break;
case 4:
printf("成功退出\n");
return 0;
default:
printf("error\n");
return -1;
}
}
return 0;
}
C语言实现麦当劳菜单
于 2025-04-27 10:51:21 首次发布