1动态通讯录
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 15
#define ADDER_MAX 30
#define DEFAULT_SZ 3
#define DEFAULT_INC 2
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef struct PeoInfo
{
char name[NAME_MAX];
long int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDER_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo *data;
int sz;
int capacity;
}Contact, *pContact;
enum MyEnum
{
Exit,
Add,
Del,
Search,
Modify,
Show,
Sort,
Clear
};
void InitContact(pContact pcon);
void AddContact(pContact pcon);
int SearchContact(pContact pcon);
void ShowContact(pContact pcon);
void DelContact(pContact pcon);
void ModifyContact(pContact pcon);
void SortContact(pContact pcon);
void ClearContact(pContact pcon);
void DestroyContact(pContact pcon);
#endif
contact.c
#include "contact.h"
void InitContact(pContact pcon)
{
pcon->sz = 0;
pcon->data = malloc(DEFAULT_SZ*sizeof(PeoInfo));
if (pcon->data == NULL)
{
perror("use malloc");
exit(EXIT_FAILURE);
}
memset(pcon->data, 0, DEFAULT_SZ*sizeof(PeoInfo));
pcon->capacity = DEFAULT_SZ;
}
void CheckContact(pContact pcon)
{
if (pcon->sz == pcon->capacity)
{
PeoInfo* ptr = realloc(pcon->data, (pcon->capacity + DEFAULT_INC)*sizeof(PeoInfo));
if (ptr == NULL)
{
perror("realloc");
exit(EXIT_FAILURE);
}
else
{
pcon->data = ptr;
}
pcon->capacity += DEFAULT_INC;//容量变化
printf("增容成功\n");
}
}
void AddContact(pContact pcon)
{
assert(pcon->data);
CheckContact(pcon);
printf("请输入名字>: ");
scanf("%s", pcon->data[pcon->sz].name);
printf("请输入性别>: ");
scanf("%s", pcon->data[pcon->sz].sex);
printf("请输入年龄>: ");
scanf("%d", &pcon->data[pcon->sz].age);
printf("请输入电话>: ");
scanf("%s", pcon->data[pcon->sz].tele);
printf("请输入地址>: ");
scanf("%s", pcon->data[pcon->sz].addr);
pcon->sz++;
printf("录入成功\n");
}
static int FindEntry(pContact pcon, char name[])
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
int SearchContact(pContact pcon)
{
char name[NAME_MAX];
printf("请输入要查询的姓名: ");
scanf("%s", name);
int pos = 0;
pos = FindEntry(pcon, name);
if (pos == -1)
{
printf("你要查询的人不存在\n");
return;
}
else
{
printf("姓名:%10s\t性别:%5s\t年龄:%5d\t电话:%10s\t住址:%15s\n", pcon->data[pos].name,pcon->data[pos].sex,
pcon->data[pos].age,
pcon->data[pos].tele,
pcon->data[pos].addr);
}
}
void ShowContact(pContact pcon)
{
printf("联系人信息:\n");
int i = 0;
printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].tele,
pcon->data[i].addr);
}
}
void DelContact(pContact pcon)
{
char name[NAME_MAX];
printf("请输入要删除的除联系人\n");
scanf("%s", name);
int pos = 0;
pos = FindEntry(pcon, name);
if (pos == -1)
{
printf("要删除的联系人不存在");
return;
}
else
{
int j = 0;
for (j = pos; j < pcon->sz; j++)
{
pcon->data[j] = pcon->data[j + 1];
}
pcon->sz--;
printf("删除成功\n");
}
}
void ModifyContact(pContact pcon)
{
char name[NAME_MAX];
printf("请输入要修改的除联系人\n");
scanf("%s", name);
int pos = 0;
pos = FindEntry(pcon, name);
if (pos != -1)
{
printf("请输入修改后的姓名: ");
scanf("%s", pcon->data[pcon->sz].name);
printf("请输入修改后的性别: ");
scanf("%s", pcon->data[pcon->sz].sex);
printf("请输入修改后的年龄: ");
scanf("%d", &pcon->data[pcon->sz].age);
printf("请输入修改后的电话: ");
scanf("%s", pcon->data[pcon->sz].tele);
printf("请输入修改后的地址: ");
scanf("%s", pcon->data[pcon->sz].addr);
printf("修改完毕\n");
}
else
{
printf("要修改的联系人不存在!\n");
}
}
void SortContact(pContact pcon)
{
int i = 0;
int j = 0;
for (i = 0; i < pcon->sz - 1; i++)
{
for (j = 1; j < pcon->sz - i - 1; j++)
{
if (strcmp(pcon->data[i].name, pcon->data[i + 1].name)<0)
{
struct PeoInfo tem;
tem = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tem;
}
}
}
printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].tele,
pcon->data[i].addr);
}
printf("排序完成\n");
}
void ClearContact(pContact pcon)
{
pcon->sz = 0;
}
void DestroyContact(pContact pcon)//回收空间
{
free(pcon->data);
pcon->data = NULL;
pcon->sz = 0;
pcon->capacity = 0;
}
test.c
#include"contact.h"
void menu()
{
printf("*********************************\n");
printf("*** 1. Add 2. Del ***\n");
printf("*** 3.Search 4.Modify***\n");
printf("*** 5. Show 6.Sort ***\n");
printf("*** 7.Clear 0.Exit ***\n");
printf("*********************************\n");
}
void test()
{
Contact my_con;
InitContact(&my_con);
int input = 0;
do
{
menu();
printf("请选择>: ");
scanf("%d", &input);
switch (input)
{
case Exit:
DestroyContact(&my_con);
break;
case Add:
AddContact(&my_con);
break;
case Del:
DelContact(&my_con);
break;
case Search:
SearchContact(&my_con);
break;
case Modify:
ModifyContact(&my_con);
break;
case Show:
ShowContact(&my_con);
break;
case Sort:
SortContact(&my_con);
break;
case Clear:
ClearContact(&my_con);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
2.练习动态内存开辟
malloc
calloc
realloc
free
函数
malloc
calloc
realloc
free
函数
1、操作系统有记录空闲内存地址的链表;收到程序申请时,遍历链表,
2、找到第一个堆空间大于该空间的堆节点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序
3、这块内存空间的首地址处会记录本次分配空间的大小,这样代码中的delete语句才能正确释放该空间
4、找到堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲结点链表
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意
2、找到第一个堆空间大于该空间的堆节点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序
3、这块内存空间的首地址处会记录本次分配空间的大小,这样代码中的delete语句才能正确释放该空间
4、找到堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲结点链表
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意
思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有
的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将
提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储
的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小
受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
#include<stdio.h>//malloc开辟空间
#include<stdlib.h>
int main()
{
int num = 5;
int *ptr = NULL;
ptr = (int *)malloc(num*sizeof(int));
if (ptr != NULL)
{
int i = 0;
for (i = 0; i < num; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);
ptr = NULL;
return 0;
}
#include <stdio.h>//calloc
#include <stdlib.h>
int main()
{
int *p = calloc(10, sizeof(int));
if (NULL != p)
{
// 使⽤空间
}
free(p);
p = NULL;
return 0;
}
#include <stdio.h>//realloc
int main()
{
int *ptr = malloc(100);
if (ptr != NULL)
{
// 业务处理
}
else
{
exit(EXIT_FAILURE);
}
ptr = realloc(ptr, 1000);
int*p = NULL;
p = realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
free(ptr);
return 0;
}