#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef struct {
double num;
struct list* next;
}list;
void menu() {
printf("请输入操作:\n");
printf("1,增加\n");
printf("2,删除\n");
printf("3,修改\n");
printf("4,查找\n");
printf("5,浏览\n");
printf("6,排序\n");
printf("7,退出\n");
}
list* creatnode() {//创建一个节点并返回其地址
list* pnode = (list*)malloc(sizeof(list));
assert(pnode);
pnode->next = NULL;
pnode->num = 0;
return pnode;
}
list* findnode(list* head,double data) {//返回含指定数据节点的地址
if (!head)
{
return NULL;
}
list* q = head->next;//q指向第一个节点
while (q) {//遍历链表,如果找到,则返回其地址
if (q->num == data) {
return q;
}
q = q->next;
}
return NULL;
}
void insert(list* head, list* p) {//尾插法
list* q = head;
assert(head);
while(q->next) //找到最后一个节点
q = q->next;
q->next = p;//q为最后一个节点,让它指向p
}
void pre_insert(list* head, list* p) {//前插
assert(head);
p->next = head->next;
head->next = p;
}
void showlist(list *head) {
if (!head)
{
printf("链表不存在\n");
return;
}
list* p = head->next;//p指向第一个节点
while (p) {//当p不为空
printf("%lf\n", p->num);
p = p->next;
}
}
list* initnode(list* p,double data) {//节点初始化
if (p) {//只要节点不为空
p->num = data;
}
return p;
}
bool deletenode(list* head, double data) {//删除对应数据的节点
if (!head)
return false;
list* p = head;
list* q = head->next;
while (q) {//用q遍历链表
if (q->num == data) {//如果找到了
p->next = q->next;
free(q);//释放节点
return true;
}
p = q;//p和q同时向前推
q = q->next;
}
return false;
}
bool modify_node(list* head, double data1, double data2) {//把数据为data1的一个节点修改为data2
list* p = findnode(head, data1);//查找data1
if (p != NULL) {//找到了
p->num = data2;
return true;
}
return false;
}
void swap(list* p, list* q) {//交换节点中的数据
list pnode;
pnode.num = p->num;
p->num = q->num;
q->num = pnode.num;
}
void sort(list* head) {//冒泡排序,操作的是节点中数据
if (head == NULL)
return;
list* p = head->next;
while (p) {
list* q = head->next;
while (q) {
if (p->num < q->num)
swap(p, q);
q = q->next;
}
p = p->next;
}
}
bool loaddata(list* head) {//加载数据
FILE* fp = fopen("data.txt", "r");//以读的方式打开文件
fp = fopen("data.txt", "w+");
if (!fp) {
printf("文件无法打开\n");
return false;
}
list data;
while (fscanf(fp, "%lf\n", &data.num) != EOF) //加载文件里的数据到链表
insert(head, initnode(creatnode(), data.num));//创建一个结点,用data.num初始化,再插入链表
fclose(fp);
return true;
}
bool savelist(list* head) {//保存文件
FILE* fp = fopen("data.txt", "w+");//以写的方式打开文件
if (!fp) {
printf("文件无法打开\n");
return false;
}
list* p = head->next;
while (p) {//遍历链表,保存到文件,把文件里的数据覆盖掉
fprintf(fp, "%lf\n", p->num);
p = p->next;
}
fclose(fp);
return true;
}
int main() {
list* head=creatnode();//带头结点的链表
list* p;//后面输入数据用
double data,data1;
int func = -1;
loaddata(head);//加载文件中的数据
while(func != 7) {
system("cls");//清屏
menu();//显示菜单
scanf("%d", &func);
switch (func)
{
case 1://增加节点
p = creatnode();
if (p == NULL)
{
printf("创建节点失败\n");
break;
}
printf("输入值\n");
scanf("%lf", &data);
initnode(p, data);
insert(head, p);
printf("添加成功\n");
break;
case 2://
printf("输入删除节点的数据\n");
scanf("%lf", &data);
if (deletenode(head, data) == true)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 3:
printf("输入要修改节点的数据\n");
scanf("%lf", &data);
printf("输入修改后节点的数据\n");
scanf("%lf", &data1);
if (modify_node(head, data, data1) == true)
printf("修改成功\n");
else
printf("修改失败\n");
break;
case 4:
printf("输入要查找的数据\n");
scanf("%lf", &data);
p = findnode(head, data);
if (p!=NULL)
printf("%lf\n", p->num);
else
printf("查找失败\n");
break;
case 5:
showlist(head);
break;
case 6://排序
sort(head);
break;
default:
break;
}//switch
savelist(head);//保存文件
system("pause");//按任意键继续
}//while
return 0;
}
c语言管理系统(链表+文件)
最新推荐文章于 2024-07-24 02:05:32 发布