「已注销」 2022-12-20 08:17 采纳率: 91.2%
浏览 122
已结题

通讯管理系统,在我运行之后,如图所示输入之后,Save函数似乎没有起到作用

通讯管理系统,在我运行之后,如图所示输入之后,Save函数似乎没有起到作用,我看了文本文件,里面还是没有内容,而且在Save函数下面的一条语句也没有输出(返回主菜单),请问这是怎么回事?我试着在Save函数中,关闭文件后面加了一句输出语句,发现也没有执行。
我这个是采用了双向链表,也不确定是不是链表的写法错了

img

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef int ElemType;
typedef struct {
    char name[10];        //姓名
    char road[10];        //街道
    char city[10];        //城市
    char code[10];        //邮编
    char country[10];    //国家
}person;
typedef struct node {
    person data;        //数据域
    struct node* prior;    //前驱
    struct node* next;    //后继
}ListNode, * LinkList;
LinkList InitList();                //构造一个空的线性表
LinkList Create(LinkList head);        //创建线性表
void Enter(LinkList head);            //输入。。。
void Display(LinkList head);        //显示。。。
void Search(LinkList head);            //查找。。。
void Delete(LinkList head);            //删除...
void Save(LinkList head);            //存盘。。。
void Load(LinkList head);            //装入
void Menu(LinkList head);                        //显示主菜单页面
LinkList InitList()
{
    LinkList head = (LinkList)malloc(sizeof(ListNode));        //创建头节点
    if (head == NULL)
    {
        printf("\n建立链表失败!\n");
        exit(-1);                    //退出程序
    }
    head->next = NULL;
    head->prior = NULL;
    return head;
}
LinkList Create(LinkList head)
{
    person LM;                        //定义一个person类型的数据LM        /////////
    LinkList rear;                    /////////
    rear = head;                    /////////    
    errno_t err;    //不同
    FILE* fp;
    if ((err= fopen_s(&fp, "C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "r")) == NULL)
    {
        printf("\n文件打开失败!\n");
        return NULL;
    }
    while (fscanf_s(fp, "%s%s%s%s%s", LM.name, LM.road, LM.city, LM.code, LM.country) != EOF)    //从文件读入,处理到文件尾
    {
        LinkList s = (LinkList)malloc(sizeof(ListNode));
        s->data = LM;
        s->next = rear->next;
        rear->next = s;
        s->prior = rear;
    }
    fclose(fp);
    return head;
}

void Save(LinkList head)
{
    LinkList rear;
    person LM;
    rear = head->next;//跳过头节点 
    FILE* fp;
    errno_t err;
    int i;
    if ((err = fopen_s(&fp,"C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "wb")) == NULL)/*只打开或建立一个二进制文件,只允许写数据*/
    {
        printf("\n文件不存在!\n");
    }
    while (rear)//处理到文件尾 
    {
        LM = rear->data;
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", LM.name, LM.road, LM.city, LM.code, LM.country);
        rear = rear->next;
    }
    fclose(fp);
}


void Enter(LinkList head)                //输入
{
    person    LM;
    char c;
    LinkList p = head;
    printf("姓名 街道 城市 邮编 国家\n");
    scanf_s("%s", LM.name);
    scanf_s("%s", LM.road);
    scanf_s("%s", LM.city);
    scanf_s("%s", LM.code);
    scanf_s("%s", LM.country);
    LinkList s = (LinkList)malloc(sizeof(ListNode));
    if (p->next == NULL)
    {
        s->data = LM;
        s->next = p->next;
        p->next = s;
        s->prior = p;
    }
    else
    {
        s->data = LM;
        p->next->prior = s;
        s->prior = p;
        s->next = p->next;
        p->next = s;
    }
    while (p->next)
    {
        p = p->next;
    }
    p->next = s;
    Save(head);                    //调用存盘函数
    printf("\n返回主菜单!\n");
    system("pause");
    Menu(head);
}
void Display(LinkList head)                      //显示所有的信息
{
    LinkList p;
    p = head->next;
    if (!p)                    //如果p为空,说明head指针为空,即链表为空
    {
        printf("\n线性表为空!\n");
        printf("请先输入人员信息!\n");
    }
    else
    {
        printf("通讯录:\n");
        printf("姓名        街道        城市        邮编        国家        \n");
        while (p)
        {
            printf("%s\t%s\t%s\t%s\t%s\n", p->data.name, p->data.road, p->data.city, p->data.code, p->data.country);
            p = p->next;

        }
        printf("\n返回主菜单!\n");
        system("pause");        //页面暂时停留
        Menu(head);
    }
}
void Search(LinkList head)                //查找
{
    int flag = 0;
    char name[10];
    printf("\n请输入要查询的联系人的姓名:");
    scanf_s("%s", name);
    LinkList rear = head->next;
    while (rear)
    {
        if (strcmp(name, rear->data.name) == 0)
        {
            printf("姓名        街道        城市        邮编        国家        \n");
            printf("%s\t%s\t%s\t%s\t%s\n", rear->data.name, rear->data.road, rear->data.city, rear->data.code, rear->data.country);
            flag = 1;
        }
        rear = rear->next;
    }
    if (flag == 1)
    {
        printf("\n成功找到该联系人!接下来将返回菜单:\n");
        system("pause");
        Menu(head);
    }
    else
    {
        printf("\n没有这位联系人!\n");
        system("pause");
        Menu(head);
    }
}
void Delete(LinkList head)
{
    LinkList rear = head;                //找到需要删除节点的前一个节点
    LinkList p = rear->next;            //找到需要删除的节点
    char name[10];
    int flag = 0;
    int n;
    printf("请输入要删除的联系人的姓名:\n");
    scanf_s("%s", name);
    printf("\n");
    while (p)
    {
        if (strcmp(p->data.name, name) == 0)
        {
            rear->next = p->next;        //删除P节点
            free(p);
            Save(head);
            flag = 1;
        }
        rear = p;
        p = p->next;
    }
    if (flag == 1)
    {
        printf("\n已成功删除该联系人!\n");
        printf("接下来将返回菜单\n");
        system("pause");
        Menu(head);
    }
    else
    {
        printf("\n没有这个联系人!\n");
        printf("接下来将返回菜单\n");
        system("pause");
        Menu(head);
    }
}

void Load(LinkList head)                //装入,读文件 
{
    errno_t err;
    FILE* fp;
    if ((err = fopen_s(&fp, "C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "r")) == NULL)
    {
        printf("\n文件不存在!\n");
        exit(0);
    }
    char ch;
    while ((ch = fgetc(fp)) != EOF)
    {
        printf("%c", ch);
    }
    fclose(fp);
    printf("\n已成功打开文件所有信息!\n");
    printf("接下来将返回菜单\n");
    system("pause");
    Menu(head);
}
void Quit(LinkList head)
{
    printf("\n欢迎下次再来!\n");
}
void Menu(LinkList head)                        //输出菜单
{
    int n;
    int flag = 0;
    do {
        printf("-----------------------------------------------------\n");
        printf("---------------->>通讯管理系统<<---------------------\n");
        printf("--------------------->>主菜单<<----------------------\n");
        printf("-----------------------------------------------------\n");
        printf("*    1、输入联系人信息   *    2、显示联系人信息    *\n");
        printf("-----------------------------------------------------\n");
        printf("*    3、查找联系人信息   *    4、删除联系人信息    *\n");
        printf("-----------------------------------------------------\n");
        printf("*    5、存盘             *    6、装入              *\n");
        printf("-----------------------------------------------------\n");
        printf("*    7、退出系统         *                          *\n");
        printf("-----------------------------------------------------\n");
        printf("\n请输入菜单编号:\n");
        scanf_s("%d", &n);
        if (n < 1 || n>7)
        {
            system("cls");
            printf("选择错误!  请重新选择!\n");
            system("pause");
            flag = 1;
        }
        else
        {
            break;
        }
    } while (flag == 1);
    switch (n)
    {
    case 1:Enter(head); break;
    case 2:Display(head); break;
    case 3:Search(head); break;
    case 4:Delete(head); break;
    case 5:Save(head); break;
    case 6:Load(head); break;
    case 7:Quit(head); break;
    default:printf("输入有误!");
    }
}
int main()
{
    LinkList head = InitList();
    head = Create(head);
    Menu(head);
    return 0;
}
  • 写回答

3条回答 默认 最新

  • qfl_sdu 2022-12-20 09:09
    关注

    完整代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    
    const char* filename =  "C:\\Users\\Lenovo\\Desktop\\学生信息.txt";
    
    typedef int ElemType;
    typedef struct {
        char name[10];        //姓名
        char road[10];        //街道
        char city[10];        //城市
        char code[10];        //邮编
        char country[10];    //国家
    }person;
    typedef struct node {
        person data;        //数据域
        struct node* prior;    //前驱
        struct node* next;    //后继
    }ListNode, * LinkList;
    LinkList InitList();                //构造一个空的线性表
    LinkList Create(LinkList head);        //创建线性表
    void Enter(LinkList head);            //输入。。。
    void Display(LinkList head);        //显示。。。
    void Search(LinkList head);            //查找。。。
    void Delete(LinkList head);            //删除...
    void Save(LinkList head);            //存盘。。。
    void Load(LinkList head);            //装入
    void Menu(LinkList head);                        //显示主菜单页面
    
    
    LinkList InitList()
    {
        LinkList head = (LinkList)malloc(sizeof(ListNode));        //创建头节点
        if (head == NULL)
        {
            printf("\n建立链表失败!\n");
            exit(-1);                    //退出程序
        }
        head->next = NULL;
        head->prior = NULL;
        return head;
    }
    LinkList Create(LinkList head)
    {
        person LM;                        //定义一个person类型的数据LM        /////////
        LinkList rear;                    /////////
        rear = head;                    /////////    
        errno_t err;    //不同
        FILE* fp;
    
        while (rear->next)
            rear = rear->next;
    
        if ((err = fopen_s(&fp, filename, "r")) != 0)
        {
            printf("\n文件打开失败!\n");
            return head;
        }
        while (fscanf_s(fp, "%s%s%s%s%s", LM.name, 10, LM.road, 10, LM.city, 10, LM.code, 10, LM.country, 10) != EOF)    //从文件读入,处理到文件尾
        {
            LinkList s = (LinkList)malloc(sizeof(ListNode));
            s->data = LM;
            s->next = NULL;
            rear->next = s;
            s->prior = rear;
            rear = s;
        }
        fclose(fp);
        return head;
    }
    
    void Save(LinkList head)
    {
        LinkList rear = head->next;
        person LM;
        FILE* fp;
        errno_t err;
        if ((err = fopen_s(&fp, filename, "w")) != 0)
        {
            printf("文件打开失败!\n");
            return;
        }
        while (rear)
        {
            LM = rear->data;
            fprintf(fp, "%s %s %s %s %s\n", LM.name, LM.road, LM.city, LM.code, LM.country);
            rear = rear->next;
        }
        fclose(fp);
    }
    
    
    void Enter(LinkList head) //这里用指针,否则无法返回链表头
    {
        char c;
        LinkList p = head;
        LinkList s = (LinkList)malloc(sizeof(ListNode));
        s->next = NULL;
        s->prior = NULL;
        printf("姓名 街道 城市 邮编 国家\n");
        scanf_s("%s", s->data.name, 10);
        scanf_s("%s", s->data.road, 10);
        scanf_s("%s", s->data.city, 10);
        scanf_s("%s", s->data.code, 10);
        scanf_s("%s", s->data.country, 10);
    
        p = head;
        while (p->next)
            p = p->next; //移动到链表末尾
        p->next = s;
        s->prior = p; //这个前向指针可以不要
        //下面的语句没改
        Save(head);
        printf("\n返回主菜单!\n");
        system("pause");
        Menu(head);
    }
    
    void Display(LinkList head)                      //显示所有的信息
    {
        LinkList p;
        p = head->next;
        if (!p)                    //如果p为空,说明head指针为空,即链表为空
        {
            printf("\n线性表为空!\n");
            printf("请先输入人员信息!\n");
        }
        else
        {
            printf("通讯录:\n");
            printf("姓名        街道        城市        邮编        国家        \n");
            while (p)
            {
                printf("%s\t%s\t%s\t%s\t%s\n", p->data.name, p->data.road, p->data.city, p->data.code, p->data.country);
                p = p->next;
            }
            printf("\n返回主菜单!\n");
            system("pause");        //页面暂时停留
            Menu(head);
        }
    }
    
    void Search(LinkList head)                //查找
    {
        int flag = 0;
        char name[10];
        printf("\n请输入要查询的联系人的姓名:");
        scanf_s("%s", name, 10);
        LinkList rear = head->next;
        while (rear)
        {
            if (strcmp(name, rear->data.name) == 0)
            {
                printf("姓名        街道        城市        邮编        国家        \n");
                printf("%s\t%s\t%s\t%s\t%s\n", rear->data.name, rear->data.road, rear->data.city, rear->data.code, rear->data.country);
                flag = 1;
            }
            rear = rear->next;
        }
        if (flag == 1)
        {
            printf("\n成功找到该联系人!接下来将返回菜单:\n");
            system("pause");
            Menu(head);
        }
        else
        {
            printf("\n没有这位联系人!\n");
            system("pause");
            Menu(head);
        }
    }
    
    void Delete(LinkList head)
    {
        LinkList rear = head;                //找到需要删除节点的前一个节点
        LinkList p = rear->next;            //找到需要删除的节点
        char name[10];
        int flag = 0;
        int n;
        printf("请输入要删除的联系人的姓名:\n");
        scanf_s("%s", name, 10);
        printf("\n");
        while (p)
        {
            if (strcmp(p->data.name, name) == 0)
            {
                rear->next = p->next;        //删除P节点
                free(p);
                Save(head);
                flag = 1;  break;
            }
            rear = p;
            p = p->next;
        }
        if (flag == 1)
        {
            printf("\n已成功删除该联系人!\n");
            printf("接下来将返回菜单\n");
            system("pause");
            Menu(head);
        }
        else
        {
            printf("\n没有这个联系人!\n");
            printf("接下来将返回菜单\n");
            system("pause");
            Menu(head);
        }
    }
    void Load(LinkList head)                //装入,读文件 
    {
        errno_t err;
        FILE* fp;
        if ((err = fopen_s(&fp, filename, "r")) != 0)
        {
            printf("\n文件不存在!\n");
            exit(0);
        }
        char ch;
        while ((ch = fgetc(fp)) != EOF)
        {
            printf("%c", ch);
        }
        fclose(fp);
        printf("\n已成功打开文件所有信息!\n");
        printf("接下来将返回菜单\n");
        system("pause");
        Menu(head);
    }
    void Quit(LinkList head)
    {
        printf("\n欢迎下次再来!\n");
    }
    void Menu(LinkList head)                        //输出菜单
    {
        int n;
        int flag = 0;
        do {
            printf("-----------------------------------------------------\n");
            printf("---------------->>通讯管理系统<<---------------------\n");
            printf("--------------------->>主菜单<<----------------------\n");
            printf("-----------------------------------------------------\n");
            printf("*    1、输入联系人信息   *    2、显示联系人信息    *\n");
            printf("-----------------------------------------------------\n");
            printf("*    3、查找联系人信息   *    4、删除联系人信息    *\n");
            printf("-----------------------------------------------------\n");
            printf("*    5、存盘             *    6、装入              *\n");
            printf("-----------------------------------------------------\n");
            printf("*    7、退出系统         *                          *\n");
            printf("-----------------------------------------------------\n");
            printf("\n请输入菜单编号:\n");
            scanf_s("%d", &n);
            if (n < 1 || n>7)
            {
                system("cls");
                printf("选择错误!  请重新选择!\n");
                system("pause");
                flag = 1;
            }
            else
            {
                break;
            }
        } while (flag == 1);
        switch (n)
        {
        case 1:Enter(head); break;
        case 2:Display(head); break;
        case 3:Search(head); break;
        case 4:Delete(head); break;
        case 5:Save(head); break;
        case 6:Load(head); break;
        case 7:Quit(head); break;
        default:printf("输入有误!");
        }
    }
    int main()
    {
        LinkList head = InitList();
        head = Create(head);
        Menu(head);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 赞助了问题酬金15元 12月20日
  • 修改了问题 12月20日
  • 展开全部

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教