链表的基本操作与文件操作--期末大作业代码部分

包括:

链表的基本操作:增删改查 包括一个反向冒泡排序。

文件的导出与读取。


算是数据结构学习的第一课作业。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define len sizeof(struct des)
struct des{
	int num;
	int price;
	char name[22];
	struct des *next;
};

int n;     //节点个数
int menu(){                      //菜单
	int s;
	char ch;
	printf("               欢迎进入甜点选择系统   o(≧ω≦)o           \n");
	printf(" o(* ̄▽ ̄*)ブ|| 1 || 增加甜点的信息\n");
	printf("              || 2 || 查找已输入的甜点信息\n");
	printf("              || 3 || 修改甜点信息\n");
	printf("              || 4 || 删除甜点信息\n");
	printf("              || 5 || 按编号从小到大输出甜品信息\n");
	printf("              || 6 || 导出甜点信息\n");
	printf("              || 7 || 退出甜点管理系统\n");
	printf("-------------------------------------------------------------------------\n");
	while (scanf("%d", &s) == EOF || s > 7 || s < 1){
		while (ch = getchar() != '\n');
		printf("输入错了QuQ请输入1~6以内的数字喵");
	}
	return s;
}
des *head;
FILE *file;
des *createNode()                       //创建链表
{
	struct des *p;
	p = (des*)malloc(len);
	p->next = NULL;
	return p;
}



void sort(){                  //反向冒泡法排序
	des *tail = NULL, *p, *q;
	while (tail != head->next){
		p = head;
		q = p->next;
		while (q->next != tail){
			if (p->next->num > q->next->num){
				p->next = q->next;
				q->next = q->next->next;
				p->next->next = q;
			}
			p = p->next;
			q = q->next;
		}
		tail = q;
	}
}

void del(){                         //删除数据
	sort();
	int pos;
	des *p = head, *l;
	l = p->next;
	int i=1; 
	printf("少年、告诉我要删除甜品的编号吧:");
	scanf("%d", &pos);
	while (l!= NULL){
		if (l->num == pos){
			p->next = p->next->next;
			free(l);
			break;
		}
		p = p->next;
		l = p->next;
	}
	if (l == NULL){
		printf("没有找到这个数据啊喵QAQ\n");
	}
	else
	printf("(成功删除了这个甜品数据=w=\n");
 }


void show(){     //按从低到高顺序打印数据
	sort();
	des *p;
	p = head->next;
	if (p == NULL)
		printf("当前并没有数据\n");
	else{
		printf("=============================================================\n");
		printf("      编号                名称                 价格 \n");
		printf("-------------------------------------------------------------\n");
	}
	while (p != NULL){
		printf("       %d\t||\t%s\t\t||\t%d\n", p->num, p->name, p->price);
		p = p->next;
	}
			printf("=============================================================\n");
}

void destroy(des *cur)
{
	if (cur->next != NULL)
		destroy(cur->next);
	if (cur != NULL)
		free(cur);
}

void find(){                       //查询甜品数据
	des *p;
	int pos, i=1;
	printf("请输入要查询的数据编号");
	scanf("%d", &pos);
	p = head->next;
	while (p){
		 if (p->num == pos)
			break;
		 p = p->next;
	}
	if (p!=NULL){
		printf("=============================================================\n");
		printf("      编号                名称                 价格 \n");
		printf("-------------------------------------------------------------\n");
		printf("       %d\t||\t%s\t\t||\t%d\n", p->num, p->name, p->price);
		printf("=============================================================\n");
	}
	else
		printf("并没有找到这个甜品信息!\n");
}

void read()
{
	if (!(file = fopen("D:\\biu.bin", "rb")))
	{
		printf("无法打开文件");
		return;
	}
	else
		printf("成功打开了该文件~");
	des *n;
	if (head->next != NULL)
	{
		destroy(head->next);
		head->next = NULL;
	}
	while (true)
	{
		n = createNode();
		if (!fread(n, sizeof(des), 1, file))
			break;
		n->next = head->next;
		head->next = n;
	}
	fclose(file);
}

void write(des *p)
{
	if (!(file = fopen("biu.bin", "wb")))
	{
		printf("文件写入失败QAQ");
		return;
	}
	if (p == NULL)
	{
		fputs("", file);
		fclose(file);
		return;
	}
	while (true)
	{
		if (fwrite(p, sizeof(des), 1, file) != 1)
			printf("文件写入失败QAQ");
		if (p->next == NULL)
			break;
		p = p->next;
	}
	fclose(file);
}

void add(){                     //输入数据
	des *h;
	char s;
	printf("请输入甜品信息 \n");
	do{
		h = createNode();
		printf("请输入甜品的编号: \n");
		scanf("%d", &h->num);
		printf("请输入甜品的名称: \n");
		scanf("%s", &h->name);
		printf("请输入甜品的价格: \n");
		scanf("%d", &h->price);

		h->next = head->next;
		head->next = h;
		getchar();
		printf("是否还要接着输入(Y/N)");
		scanf("%c", &s);

	} while (s == 'Y' || s == 'y');

	write(head->next);
}


void edit(){                    //修改甜品数据
	int i, pos;
    des *p;
	printf("请输入要修改的甜品数据的编号: ");
	scanf("%d", &pos);
	p = head;
	while (p->next){
		p = p->next;
		if (p->num == pos)
			break;
	}
	if (p->next == NULL)
		printf("找不到这个数据,请验证一下!\n");
	else{
		printf("请输入甜品的新名字: ");
		scanf("%s", &p->name);
		printf("请输入甜品的新价格: ");
		scanf("%d", &p->price);
		printf("甜品信息编辑成功!\n ");
	}
}	

void fprintf(){
	des *a = head->next;
    if (head->next == NULL){
		printf("当前没有收支数据");
	}
	if (!(file = fopen("tp.txt", "w")))
	{
		printf("无法打开该文件");
		return;
	}
	des *p = head->next;
	fprintf(file,"=============================================================\n");
	fprintf(file,"      编号                名称                 价格 \n");
	fprintf(file,"-------------------------------------------------------------\n");
	while (1){
		fprintf(file,"       %d\t||\t%s\t\t||\t%d\n", p->num, p->name, p->price);
		if (p->next == NULL)
			break;
		p = p->next;
	}
	fprintf(file, "============================================================\n");
	fclose(file);
	printf("收支数据已输出到tp.txt,请查看喵~<( ̄︶ ̄)>\n");
	system("notepad tp.txt");

}
int main(){
	system("COLOR 47");
	head = createNode();
	head->next = NULL;
	int c;
	printf("★  导入文件请输入 1\n");
	printf("★  手动输入请输入 2\n");
	printf("如需输入文件,请将二进制文件放置在D盘根目录下,并命名为biu.bin\n");
	scanf("%d", &c);
	if (c == 1)
		read();
	while (1){
		system("pause");
		system("CLS");
		switch (menu()){
		case 1:add(); break;
		case 2:find(); break;
		case 3:edit(); break;
		case 4:del(); break;
		case 5:show(); break;
		case 6:fprintf(); break;
		case 7:destroy(head); exit(0); 
			system("pause");

		}
	}
}
VS编译通过。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值