动态通讯录(用顺序表实现)

利用顺序表实现动态通讯录,实质就是一个动态顺序表,基本代码和顺序表大致
相同,涉及到结构体的创建,初始化,插入,删除,查找等功能。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//定义一个通讯录内容
typedef struct communicate{
	char name[20];
	char sex[10];
	char num[15];
}com;
//定义一个通讯录
typedef struct note{
	com* array;    //通讯录中存的个体
	int capacity;  //容量
	int size;     //有效个数
}note;
//通讯录初始化
void note_Init(note* seq){
	assert(seq != NULL);  //传进来的通讯录不为空
	seq->capacity = 5;   //先设置一个容量为5的(可以随意设置)
	seq->array = (com*)malloc(sizeof(com)*seq->capacity); //申请内存空间
	seq->size = 0;  //有效个数为0
}
//销毁
void note_destory(note* seq){
	assert(seq != NULL);
	free(seq->array);
}
//判断+扩容
void note_check(note* seq){
	if (seq->size < seq->capacity){  //有效个数小于容量,不扩容
		return;
	}
	else if (seq->size == seq->capacity){  
		int newcapacity = seq->capacity + 2;  
		com* newarray = (com*)realloc(seq->array,sizeof(com)*newcapacity);
		seq->array = newarray;
		seq->capacity = newcapacity;
	}
}

//添加号码
void note_insert(note* seq){
	note_check(seq);      //先判断容量
	printf("请输入姓名:");
	scanf("%s", seq->array[seq->size].name);
	printf("\n");
	printf("请输入性别:");
	scanf("%s", seq->array[seq->size].sex);
	printf("\n");
	printf("请输入学号:");
	scanf("%s", seq->array[seq->size].num);
	printf("\n");
	seq->size++;
	printf("添加成功!\n");
}

//查找(按姓名)
void name_search(note* seq){
	assert(seq->size > 0);  
	char sname[20];
	printf("请输入姓名:\n");
	scanf("%s", sname);
	for (int i = 0; i < seq->size; i++){
		if (strcmp(sname,seq->array[i].name)==0){
			printf("找到了该联系人:\n");
			printf("%s  %s  %s \n", seq->array[i].name,
				seq->array[i].sex, seq->array[i].num);
			return;
		}

	}
		printf("未找到有效数据\n");
		
}
//查找(按号码)与按姓名查找代码基本相同,不再敲出
void num_search(note* seq){}
//删除
void note_eraser(note* seq){
	assert(seq ->size> 0);
	printf("请输入想删除的人:\n");
	char sname[20];
	scanf("%s",sname);
	
	for (int i = 0; i < seq->size; i++){
		if (strcmp(sname, seq->array[i].name) == 0){	
		   //循环,用后一组的值覆盖前一组的值
			for (int j = i; j < seq->size-1; j++){
				seq->array[j] = seq->array[j+1];
			}
			seq->size--;
		}
		else{
			printf("未找到有效数据,删除失败!\n");
		}
	}
}

//打印
void note_print(note* seq){
	assert(seq->size > 0);
	for (int i = 0; i < seq->size; i++){
		printf("%s\t%s\t%s\t ", seq->array[i].name, 
			seq->array[i].sex, seq->array[i].num);
		printf("\n");
	}
}
void menu(){
	printf("*********************\n");
	printf("   1.添加联系人\n");
	printf("   2.删除联系人\n");
	printf("   3.按姓名查找联系人\n");
	printf("   4.按号码查找联系人\n");
	printf("   5.打印联系人\n");
	printf("   6.退出程序\n");
}

int main(){
	menu();
	note p;
	note_Init(&p);
	while (true)
	{
		int i;
		scanf("%d", &i);
		if (i == 1){
			note_insert(&p);
		}
		else if (i==2){
			note_print(&p);
		}
		else if (i == 3){
			name_search(&p);
		}
		else if(i==4){
			note_eraser(&p);
		}
		else if (i == 6){
			break;
		}
		else{
			printf("输入选项有误\n");
		}

	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43755544/article/details/89289603