//电话号码查询系统
#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