数据结构——电话本-顺序表



//电话号码查询系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LIST_INIT_SIZE 100 //确定分配空间大小 


//联系人信息结构体类型
typedef struct contato
{
	char name[20];
	char phone[20];
}contato;

//定义顺序类型sqlist
typedef struct sqlist
{
	contato *con;
	int len;  //记录数据的个数;
	int listsize;//记录申请的内存个数;
}sqlist;

//函数的原型声明 
int Initlist(sqlist &L);//构造一个空的线性表;
int creat(sqlist &L);//创建顺序表;
int outlist(sqlist L); //打印线性表
int recreat (sqlist &L,int n);//申请重新分配内存;
int insert(sqlist &L);//添加联系人
int delelist(sqlist &L,struct contato &a);//删除联系人


//主函数部分;
int main()
{
	int op;
	struct contato a;
	sqlist s1;
    Initlist(s1);
	printf("\n    欢迎使用小胖子电话本!");
	while(1){
		printf("\n\n");
		printf("        ***菜单***\n");
    	printf("  ------------------------\n");
		printf("  |    1.添加联系人信息     |\n");
	    printf("  |    2.删除联系人信息     |\n"); 
		printf("  |    3.插入联系人信息     |\n");	
		printf("  |    4.打印联系人信息     |\n");
        printf("  |    0.退出程序           |\n");
		printf("  ------------------------\n");
		printf("请选择你要进行的操作(0~4):");
		scanf("%d",&op);  
		if(op==1)
		{
			creat(s1);
		}
		else if(op==2)
		{
			delelist(s1,a);
		}
		else if(op==3)
		{
			insert(s1);
		}
		else if(op==4)
		{
			outlist(s1);
		}
		else if(op==0)
		{
			printf("已退出程序!\n");
			free(s1.con);
	    	exit(0);
		}
		else
		{
			printf("你输入的选项不存在,请重新输入!\n");
		}
	}
	return 0;
}

//为顺序表申请分配内存空间///
//返回值是int型,来确认申请内存是否成功;
//参数是一个结构体,参数引用;
int Initlist(sqlist &L)
{
	//申请分配了LIST_INIT_SIZE个contato类型的内存空间
	//该内存空间是连续的,相当于一个数组
	L.con =(contato *)malloc(LIST_INIT_SIZE*sizeof(contato));
	if(L.con==NULL)
	{
		printf("没有足够的内存保存联系人!\n");
		exit(0);
	}
	L.len=0;      //顺序表中还没有放数据,所以数据个数为0;
	L.listsize=LIST_INIT_SIZE; //申请了LIST_INIT_SIZE个内存空间;
	return 1;
}

//重新申请分配内存
//当第一次申请的内存不够,用realloc函数再次请求分配内存;
int recreat (sqlist &L,int n)
{
    //避免再申请内存失败,定义一个新的sqlist类型变量来存新分配的内存地址;
	sqlist pb;
	pb.con=(contato *)realloc(L.con,(n+L.len)*sizeof(contato));
	if(pb.con==NULL)
	{
		printf("没有足够的内存保存联系人!\n");
		return 0;
	}
	//当请求分配内存成功,就用新的地址把旧地址覆盖掉;
	else
	{
		L.con=pb.con;
		pb.con=NULL;
	}
	L.listsize=n+L.len; // 总内存个数变化;
	return 1;
}

/创建顺序表//
int creat(sqlist &L)
{
	int n,i,flag=1,m;
	if(L.len==0) printf("暂时还未存有联系人信息!\n");
	else printf("电话本中已存有%d名联系人信息!\n",L.len);
	printf("请输入要保存的联系人个数:");
	scanf("%d",&n);
	//现有的内存空间不足以存储要保存的联系人个数时
	//要请求再分配内存;
	while(n<1)
	{
		printf("输入的联系人个数必须是正数!\n");
		printf("请重新输入:");
		scanf("%d",&n);
		if(n>0) break;
	}
	if(L.listsize<L.len+n)
	{
		recreat(L,n);
		flag=0;
	}
	//现有的内存足够保存联系人个数;
    if(flag==1)
	{
		m=L.len;	
		for(i=m;i<n+m;i++)
		{
			printf("请输入第%d个联系人的姓名:",i+1);
			scanf("%s",L.con[i].name);
			printf("请输入第%d个联系人的电话:",i+1);
			scanf("%s",L.con[i].phone);
			L.len++;
		}
	}
	//重新申请内存成功;
	if (flag==0)
	{
		m=L.len;
		for(i=L.len;i<L.listsize;i++,m++)
		{
			printf("请输入第%d个联系人的姓名:",m+1);
			scanf("%s",L.con[i].name);
			printf("请输入第%d个联系人的电话:",m+1);
			scanf("%s",L.con[i].phone);
			L.len++;
		}

	}
	printf("成功保存%d个联系人信息!\n",n);
	return 1;
}

/输出顺序表//
int outlist(sqlist L)
{
	int i=1;
	struct contato *q;
	if(L.len==0)
	{
		printf("电话本中还没有保存联系人信息!\n");
		return 0;
	}
	else
	{
		q=L.con;
		printf("共检测到有%d名联系人的信息!\n",L.len);
		printf("--------------------------------------\n");
		printf(" 序号        姓名           电话\n");
		//申请的内存都是连续的,q++表示指向下一个contato类型中存储的数据
		for(q;q<L.con+L.len;q++,i++)
		{
			printf("  %d%15s   %15s\n",i,q->name,q->phone);
		}
		printf("--------------------------------------\n");
	}
	return 1;
}


///插入数据///
int insert(sqlist &L)
{
	int n,i;
	printf("电话本中已存有%d名联系人的信息\n",L.len);
	outlist(L);
	printf("请输入要添加的联系人要放在第几个位置: ");
	scanf("%d",&n);
	if(n<1 || n>L.len+1) 
	{
		printf("输入的位置有误!\n");
		return 0;
	}
	else{
		if(L.len<L.listsize)
		{
			for(i=L.len;i>=n;i--)
			{
				L.con[i]=L.con[i-1];
			}
			printf("请输入要添加的联系人的名字: ");
			scanf("%s",L.con[n-1].name);
			printf("请输入要添加的联系人的电话: ");
			scanf("%s",L.con[n-1].phone);
		}
		L.len++;
		L.listsize++;
	}
	return 1;
}


///删除联系人//
int delelist(sqlist &L,struct contato &a)
{

	int n,i;
	printf("电话本中已存有%d名联系人的信息\n",L.len);
	outlist(L);
	printf("请输入要删除几号联系人: ");
	scanf("%d",&n);
	if(n<1 || n>L.len)
	{
		printf("您要删除的联系人序号不存在!\n");
		return 0;
	}
	else
	{
		strcpy(a.name,L.con[n-1].name);
		strcpy(a.phone,L.con[n-1].phone);
		for(i=n-1;i<L.len;i++)
		{
			L.con[i]=L.con[i+1];
		}
		L.len--;
	}
	return 1;
}


 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值