鱼C论坛

 找回密码
 立即注册
查看: 765|回复: 4

[已解决]疑惑点已经红色标注,求助一下,谢谢

[复制链接]
发表于 2020-3-11 12:04:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的想法是,最先前int count,初始化为0,然后在add函数里面,调用内存池空间,count--,假如这时候我调用完了内存池,count为全局变量,这时候是负的1024,然后在delete函数里面,我删除的东西放入count,count++,这时候假设内存池装满,count会加到0,但是前面if里面判断加满的条件是count<MAX,但是这样看的话count是不可能大于MAX的啊,意思就是可以继续放入内存池。请大家帮我解答一下count在里面起到的限制作用,谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
struct Person
{
        char name[40];
        char phone[20];
        struct Person* next;
};
struct Person* pool = NULL;
int count;
void getInput(struct Person* person);
void printPerson(struct Person* person);
void addPerson(struct Person* *contacts);
void changePerson(struct Person* person);
void deletPerson(struct Person** contacts);
struct Person* findPerson(struct Person* contacts);
void displayContacts(struct Person* contacts);
void relesaeContacts(struct Person** contacts);
void releasePool(void);
void getInput(struct Person* person)
{
        printf("请输入姓名:");
        scanf("%s", person->name);
        printf("请输入电话号码:");
        scanf("%s", person->phone);
}
void addPerson(struct Person* *contacts)
{
        struct Person* person;
        struct Person* temp;
        //如果内存池非空,则直接从内存池里面获取空间//
        if (pool != NULL)
        {
                person = pool;
                pool = pool->next;
                count--;
        }
        //如果内存池为空,则直接调用malloc函数申请内存空间//
        else
        {
                person = (struct Person*)malloc(sizeof(struct Person));
                if (person == NULL)
                {
                        printf("内存分配失败!\n");
                        exit(1);
                }
        }
        getInput(person);
        //将person用头插法添加到通讯录中//
        if (*contacts != NULL)
        {
                temp = *contacts;
                *contacts = person;
                person->next = temp;
        }
        else
        {
                *contacts = person;
                person->next = NULL;
        }
}
struct Person* findPerson(struct Person* contacts)
{
        struct Person* current;
        char input[40];
        printf("请输入联系人:");
        scanf("%s", input);
        current = contacts;
        while (current != NULL && strcmp(current->name, input))
        {
                current=current->next;
        }
        return current;
}
void changePerson(struct Person* contacts)
{
        struct Person* person;
        person = findPerson(contacts);
        if (person == NULL)
        {
                printf("找不到该联系人!\n");
        }
        else
        {
                printf("请输入新的联系电话:");
                scanf("%s", person->phone);
        }
}
void printPerson(struct Person* person)
{
        printf("联系人:%s\n", person->name);
        printf("联系人电话:%s\n", person->phone);
}
void deletPerson(struct Person** contacts)
{
        struct Person* person;
        struct Person* current;
        struct Person* previous;
        struct Person* temp;
        //先找到待删除的节点指针//
        person = findPerson(*contacts);
        if (person == NULL)
        {
                printf("找不到该联系人!");
        }
        else
        {
                current = *contacts;
                previous = NULL;
                //current定位到待删除的节点//
                while (current != NULL && current != person)
                {
                        previous = current;
                        current = current->next;
                }
                if (previous == NULL)
                {
                        //待删除的节点是第一个节点//
                        *contacts = current->next;
                }
                else
                {
                        //待删除的节点不是第一个节点//
                        previous->next = current -> next;
                }
                //判断内存池是否还有空位//
                if (count < MAX)
                {
                        if (pool != NULL)
                        {
                                temp = pool;
                                pool = person;
                                person->next = temp;

                        }
                        else
                        {
                                pool = person;
                                person->next = NULL;
                        }
                        count++;
                }
                else
                {
                        free(person);
                }
        }
}
void displayContacts(struct Person* contacts)
{
        struct Person* current;
        current =contacts;
        while (current != NULL)
        {
                printPerson(current);
                current = current->next;
        }
}
void relesaeContacts(struct Person** contacts)
{
        struct Person* temp;
        while (*contacts != NULL)
        {
                temp = *contacts;
                *contacts = (*contacts)->next;
                free(temp);
        }
}
void releasePool(void)
{
        struct Person* temp;
        while (pool != NULL)
        {
                temp = pool;
                pool = pool->next;
                free(temp);
        }
}
int main(void)
{
        int code;
        struct Person* contacts = NULL;
        struct Person* person;
        printf("欢迎使用通讯录管理程序|\n");
        printf("|--- 1:插入新的联系人 ---|\n");
        printf("|--- 2:查找已有的联系人 ---|\n");
        printf("|--- 3:更改已有的联系人 ---|\n");
        printf("|--- 4:删除已有的联系人 ---|\n");
        printf("|--- 5:显示当前的通讯录 ---|\n");
        printf("|--- 6:退出通讯录程序 ---|\n");
        printf("|-Power by YQHP=9527-|\n");
        while (1)
        {
                printf("\n请输入指令代码:");
                scanf("%d", &code);
                switch (code)
                {
                case 1:addPerson(&contacts); break;
                case 2:person = findPerson(contacts);
                        if (person == NULL)
                        {
                                printf("找不到该联系人!\n");
                        }
                        else
                        {
                                printPerson(person);
                        }
                        break;
                case 3: changePerson(contacts); break;
                case 4:deletPerson(&contacts); break;
                case 5:displayContacts(contacts); break;
                case 6:goto END;
                }
        }
END:
        relesaeContacts(&contacts);
        releasePool();
        return 0;
}
最佳答案
2020-3-11 12:26:59
本帖最后由 jackz007 于 2020-3-11 12:29 编辑

      count 定义在函数外部,那么,源程序文件中所有对 count 变量执行的操作,针对的都是这个函数外部变量 count,也就是说,所有的 count 都是同一个变量。当然,如果在函数内部又重新定义了 count 或 count 作为函数输入参数,那就应该另当别论,在这种情况下,函数中的 count 与函数外的 count 就不再是同一个变量了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 12:26:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-11 12:29 编辑

      count 定义在函数外部,那么,源程序文件中所有对 count 变量执行的操作,针对的都是这个函数外部变量 count,也就是说,所有的 count 都是同一个变量。当然,如果在函数内部又重新定义了 count 或 count 作为函数输入参数,那就应该另当别论,在这种情况下,函数中的 count 与函数外的 count 就不再是同一个变量了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 14:31:49 | 显示全部楼层
jackz007 发表于 2020-3-11 12:26
count 定义在函数外部,那么,源程序文件中所有对 count 变量执行的操作,针对的都是这个函数外部变 ...

那在这个2个函数里面,没有从新定义count,都是直接count++--,那么久应该是同一个count,对吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 14:49:37 | 显示全部楼层
18081665753 发表于 2020-3-11 14:31
那在这个2个函数里面,没有从新定义count,都是直接count++--,那么久应该是同一个count,对吧?

      你理解的没错,就是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 17:42:23 | 显示全部楼层
谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 00:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表