|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
本帖最后由 jackz007 于 2020-3-11 12:29 编辑
count 定义在函数外部,那么,源程序文件中所有对 count 变量执行的操作,针对的都是这个函数外部变量 count,也就是说,所有的 count 都是同一个变量。当然,如果在函数内部又重新定义了 count 或 count 作为函数输入参数,那就应该另当别论,在这种情况下,函数中的 count 与函数外的 count 就不再是同一个变量了。
|
|