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

导读:本篇文章讲解 数据结构——电话本-顺序表,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com



//电话号码查询系统

#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;
}


 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69350.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!