乔宽 发表于 2019-8-12 15:22:42

课后作业内存池,因为作业没有更新,在下面评论里有鱼油发了份没有内存池的代码。

没加内存池版本:
#include<stdio.h>
#include<stdlib.h>

struct Lin
{
      char name;
      char number;
      struct Lin *next;
} *han = NULL;


void ching(struct Lin *hand);
int recu(int i, struct Lin rea, char a[]);
void addperson(struct Lin **hand);
void findperson(struct Lin *hand);
void chingperson(struct Lin *hand);
void delperson(struct Lin **hand);
void displaycontacs(struct Lin *hand);
void freeper(struct Lin **hand);

int main(void)
{
      int num = 0;
      while (num != 6)
      {
                putchar('\n');
                printf("请输入命令:\n.....||1(添加新的联系人)||.....\n.....||2:(查找联系人)    ||.....\n.....||3:(更改联系人)    ||.....\n.....||4:(删除联系人)    ||.....\n.....||5:(查看所有联系人)||.....\n.....||6:(退出)          ||.....");
                scanf_s("%d", &num);
                switch (num)
                {
                case 1: addperson(&han); break;
                case 2: findperson(han); break;
                case 3: chingperson(han); break;
                case 4: delperson(&han); break;
                case 5: displaycontacs(han); break;
                }
      }
      freeper(&han);
}




void ching( struct Lin *hand)
{
      int num;
      while (1)
      {
                printf("输入1,改写名字\n输入2,改写号码\n输入-1,退出改写程序");
                scanf_s("%d", &num);
                switch (num)
                {
                case 1: printf("请输入名字:"); scanf_s("%s", hand->name, 30);
                case 2: printf("请输入号码:"); scanf_s("%s", hand->number, 20);
                default:printf("输入错误,请重新输入:");
                case -1: break;
                }
      }
}

int recu(int i, struct Lin rea, char a[])
{
      int z;
      do
      {
                z = a - rea.name;
                i++;
                if (z)
                {
                        break;
                }
               
      } while(rea.name != '\0');

      if (rea.name != '\0')
      {
                return -1;
      }
      return 0;
}

void addperson(struct Lin ** hand)
{
      struct Lin *adper;

      adper = (struct Lin *)malloc(sizeof(struct Lin));
      if (adper == NULL)
      {
                printf("分配内存失败!");
                exit(1);
      }

      printf("请输入联系人的名字\n:");

      scanf_s("%s", adper->name,30);

      printf("请输入电话号码\n");

      scanf_s("%s", adper->number,20);


      if (*hand == NULL)
      {
                *hand = adper;
                adper->next = NULL;
      }
      else
      {
                adper->next = *hand;
                *hand = adper;
      }
}


void findperson(struct Lin * hand)
{
      int num;
      char a;
      printf("请输入名字:\n");
      scanf_s("%s", a, 30);
      while(1)
      {
                num = recu(0, *hand, a);
                if (num == 0)
                {
                        break;
                }
                hand = hand->next;
                if (hand == NULL)
                {
                        printf("抱歉,本通讯录没有此人\n");
                        break;
                }
      }
      if (hand != NULL)
      {
                printf("你要找的%s的电话号码是%s\n", hand->name, hand->number);
      }
}

void chingperson(struct Lin * hand)
{
      int num;
      char a;
      printf("请输入名字:");
      scanf_s("%s", a, 30);
      while (1)
      {
                num = recu(0, *hand, a);
                if (num == 0)
                {
                        break;
                }
                hand = hand->next;
                if (hand == NULL)
                {
                        printf("抱歉,本通讯录没有此人\n");
                        break;
                }
      }
      if (hand != NULL)
      {
                ching(hand);
      }
      printf("请确认:");
      printf("姓名:%s",hand->name);
      printf("号码:%s\n",hand->number);
}

void delperson(struct Lin ** hand)
{
      int num;
      struct Lin *chin;
      chin = *hand;
      struct Lin *nx;
      nx = NULL;
      char a;
      printf("请输入名字:\n");
      scanf_s("%s", a, 30);
      while (1)
      {
                num = recu(0, *chin, a);
                if (num == 0)
                {
                        break;
                }
                nx = chin;
                chin = chin->next;
                if (hand == NULL)
                {
                        printf("抱歉,本通讯录没有此人\n");
                        break;
                }
      }
      if (chin == *hand)
      {
                *hand = chin->next;
                free(chin);
      }
      else
      {
                nx->next = chin->next;
                free(chin);
      }
}

void displaycontacs(struct Lin * hand)
{
      printf("开始打印全部成分:\n");
      while (hand != NULL)
      {
                printf("联系人:%s\n", hand->name);
                printf("电话:%s\n", hand->number);
                printf("====================================");
                putchar('\n');
                hand = hand->next;
      }
      printf("打印结束\n");
}

void freeper(struct Lin ** hand)
{
      struct Lin *h;
      struct Lin *n;
      h = *hand;
      *hand = NULL;
      while (h != NULL)
      {
                n = h->next;
                free(h);
                h = n;
      }
      exit(1);
}
在Linux上编译,代码对着了,但错误有很多,我想着可能忘加什么头文件或函数?
请大家帮忙看一下。

zltzlt 发表于 2019-8-12 15:24:46

什么是内存池?

乔宽 发表于 2019-8-12 16:00:07

zltzlt 发表于 2019-8-12 15:24
什么是内存池?

就是让程序额外维护一个缓存区域,当一块内存将要释放的时候,并不直接调用free函数将其释放,而是将它存放到设计好的内存池中。下次用时直接从内存池中获取直接使用。

隔壁繁星吖 发表于 2019-8-20 20:59:06

咳咳,这块还在学,先插眼

乔宽 发表于 2019-8-20 21:59:48

隔壁繁星吖 发表于 2019-8-20 20:59
咳咳,这块还在学,先插眼

我买了那个小甲鱼出的书,那书上有正确的代码。

心驰神往 发表于 2020-11-3 15:57:45

{:10_277:}
页: [1]
查看完整版本: 课后作业内存池,因为作业没有更新,在下面评论里有鱼油发了份没有内存池的代码。