exercise24

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
函数
1、操作系统有记录空闲内存地址的链表;收到程序申请时,遍历链表,
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; 
}





猜你喜欢

转载自blog.csdn.net/zn_wuxunian/article/details/80562105