综合性实验二 采用链式存储结构完成电话薄的基本操作
1.实验目的(温馨提示:此部分全班同学一致,不要修改,直接写上去就可以)
(1)掌握结点类型的定义;
(2)掌握结构体变量的定义和使用;
(3)掌握结构体指针变量做函数的参数;
(4)掌握链表的定义和使用语法规则;
(5)掌握冒泡排序算法或者选择排序算法。
2.实验内容 (温馨提示:每个题目后要给出源代码)
利用链式存储结构来完成电话薄的创建、查询、插入、删除、显示、排序以及修改等操作,具体要求如下:
1)利用尾部插入结点法建立电话薄;
2)完成在电话薄上按关键字查找即定位;
3)完成在电话薄上插入一条记录;
4)完成在电话薄上删除一条或多条记录;
5)完成电话薄的显示操作;
6)完成电话薄的排序操作;
7)完成电话薄的修改操作;
- 实验结果与调试过程
此部分根据自己的实际情况,给出实验输入数据和实验输出结果,如果碰到问题的给出调试过程。 - 实验小结
此部分根据自己的实际情况对本次实验进行总结,不要谈感想。
一.单链表解决
/*假如多个相同联系人姓名或号码,查找和删除只能删一个,需要改进*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct dianhuapu//定义结构体
{
char name[20];
char tel[20];
struct dianhuapu* next;
}DHP;
DHP *dianhuapuchushihua()//头指针初始化
{
DHP *head=(DHP*)malloc(sizeof(DHP));
if(head==NULL)
{
printf("申请电话簿失败!\n");
return NULL;
}
head->next=NULL;
return head;
}
DHP* lxrweicha(DHP* t,char* name,char* tel,int n)//尾插插入数据
{
DHP *q=t,*p=(DHP*)malloc(sizeof(DHP));
strcpy(p->name, name);
strcpy(p->tel, tel);
if(n==0)
{
t->next=p;
p->next=NULL;
return t;
}
while(n--)
q=q->next;
q->next=p;
p->next=NULL;
return t;
}
int lianxirenshuliang(DHP* t)//查询联系人数量
{
int n=1;
DHP* p=t;
while(n)
{
if(p->next==NULL)break;
p=p->next;
n++;
}
return n-1;
}
int lianxirenchazhao(DHP* t,char* name,int r)//按姓名查找
{
int n=1;
DHP* h=t->next;
while(r--)
{
if(!strcmp(h->name,name))break;
h=h->next;
n++;
}
return n;
}
int haomachazhao(DHP* t,char* name,int r)//按号码查找
{
int n=1;
DHP* h=t->next;
while(r--)
{
if(!strcmp(h->tel,name))
break;
h=h->next;
n++;
}
return n;
}
void deletelxr(DHP* t,int n)//根据需要删除的编号删除联系人
{
DHP *p,*q=t;
while(n--)
{
p=q;
q=q->next;
}
p->next=q->next;
free(q);
}
void xingmingpx(DHP* t,int n)//根据联系人进行排序
{
char x[20],h[20];
DHP *q=t;
int i,j;
for(i=1;i<n;i++)
{
t=q->next;
for(j=1;j<=(n-i);j++)
{
if(strcmp(t->name,t->next->name)>0)
{
strcpy(x,t->name);
strcpy(t->name,t->next->name);
strcpy(t->next->name,x);
strcpy(h,t->tel);
strcpy(t->tel,t->next->tel);
strcpy(t->next->tel,h);
}
t=t->next;
}
}
t=q;
}
void xianshi(DHP* t,int r)//显示电话簿所有联系人信息
{
int n=1;
DHP* p=t->next;
while(r--)
{
printf("联系人%d\n",n++);
printf("姓名————%s\n",p->name);
printf("电话号码——%s\n",p->tel);
p=p->next;
}
}
void xianshilittle(DHP* t,int n)//按位置显示
{
DHP *p=t->next;
while(--n)
p=p->next;
printf("联系人\n");
printf("姓名————%s\n",p->name);
printf("电话号码——%s\n",p->tel);
}
//根据联系人更改电话号码功能
//根据电话号码更改联系人功能
int main()
{
char name[20],tel[20];
int u=1,r,b,w,e;
DHP *t=dianhuapuchushihua();
loop:printf("请输入对应编号进行操作\n");
printf("1.添加联系人\n2.显示电话簿\n3.联系人查找\n4.电话簿排序\n5.删除联系人\n0.退出电话簿\n");
scanf("%d",&b);
getchar();
printf("\n");
if(b<0 || b>5)
{
printf("编号输入错误\n");
goto loop;
}
switch(b)
{
case 1:
while(u)
{
printf("请输入姓名\n");
scanf("%s",name);
printf("请输入号码\n");
scanf("%s",tel);
r=lianxirenshuliang(t);
t=lxrweicha(t,name,tel,r);
printf("继续存入输入1,退出输入0\n");
scanf("%d",&u);
getchar();//头尾指针初始化
}
goto loop;
case 2:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
printf("电话簿\n");
xianshi(t,r);
goto loop;
}
case 3:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
loop2:printf("请输入对应编号进行操作\n");
printf("1.按姓名查找\n2.按号码查找\n3.按位置查找\n0.返回主界面\n");
scanf("%d",&w);
getchar();
if(w==1)
{
printf("请输入查找的姓名\n");
scanf("%s",name);
e=lianxirenchazhao(t,name,r);
if(e>r)
{
printf("未找到对应姓名\n");
goto loop2;
}
xianshilittle(t,e);
goto loop;
}
else if(w==2)
{
printf("请输入查找的号码\n");
scanf("%s",tel);
e=haomachazhao(t,tel,r);
if(e>r)
{
printf("未找到对应号码\n");
goto loop2;
}
xianshilittle(t,e);
goto loop;
}
else if(w==3)
{
printf("请输入查找的位置\n");
scanf("%d",&w);
if(r<w || w<1)
{
printf("不存在该位置\n");
goto loop2;
}
xianshilittle(t,w);
goto loop;
}
goto loop2;
}
case 4:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
xingmingpx(t,r);
goto loop;
}
case 5://联系人删除
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
loop1:printf("请输入对应编号进行操作\n");
printf("1.按姓名删除\n2.按号码删除\n3.按位置删除\n0.返回主界面\n");
scanf("%d",&w);
getchar();
if(w==1)
{
printf("请输入将要删除的姓名\n");
scanf("%s",name);
e=lianxirenchazhao(t,name,r);
if(e>r)
{
printf("未找到对应姓名\n");
goto loop1;
}
deletelxr(t,e);
printf("删除成功\n");
goto loop;
}
else if(w==2)
{
printf("请输入将要删除的号码\n");
scanf("%s",tel);
e=haomachazhao(t,tel,r);
if(e>r)
{
printf("未找到对应号码\n");
goto loop1;
}
deletelxr(t,e);
printf("删除成功\n");
goto loop;
}
else if(w==3)
{
printf("请输入将要删除的位置\n");
scanf("%d",&w);
if(r<w || w<1)
{
printf("不存在该位置\n");
goto loop1;
}
deletelxr(t,w);
printf("删除成功\n");
goto loop;
}
goto loop1;
}
case 0:
return 0;
}
goto loop;
}
二.双链表解决
/*假如多个相同联系人姓名或号码,查找和删除只能删一个,需要改进*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct dianhuapu//定义结构体
{
char name[20];
char tel[20];
struct dianhuapu* fron;
struct dianhuapu* rear;
}DHP;
typedef struct dianhuapudizhi//定义结构体储存地址
{
struct dianhuapu* first;
struct dianhuapu* last;
}DHPD;
DHPD *dianhuapuchushihua()//头尾指针初始化
{
DHPD *t=(DHPD*)malloc(sizeof(DHPD));
t->first=NULL;
t->last=NULL;
return t;
}
DHPD* lxrweicha(DHPD* t,char* name,char* tel)//尾插插入数据
{
DHP* p=(DHP*)malloc(sizeof(DHP)); //新建一条struct info
strcpy(p->name, name); //先填充struct info的name和tel
strcpy(p->tel, tel);
if(t->first==NULL && t->last==NULL)
{ //如果这是第一条节点
t->first=p; //电话本的头尾指向这第一条节点
t->last=p;
p->fron=NULL; //再填充这条单个节点的前后指针
p->rear=NULL;
}
else
{
t->last->rear=p; //尾插
p->fron=t->last;
p->rear=NULL;
t->last=p;
}
return t;
}
int lianxirenshuliang(DHPD* t)//查询联系人数量
{
int n=0;
DHP* p=t->first;
if(p==NULL)
return 0;
while(++n)
{
if(p->rear==NULL)break;
p=p->rear;
}
return n;
}
DHP* lianxirenchazhao(DHPD* t,char* name,int r)//按姓名查找
{
DHP* h=t->first;
while(r--)
{
if(!strcmp(h->name,name))break;
h=h->rear;
}
return h;
}
DHP* haomachazhao(DHPD* t,char* name,int r)//按号码查找
{
DHP* h=t->first;
while(r)
{
if(!strcmp(h->tel,name))
break;
h=h->rear;
}
return h;
}
DHP* weizhichazhao(DHPD* t,int w)//位置查找
{
DHP* h=t->first;
while(--w)
{
h=h->rear;
}
return h;
}
void deletelxr(DHPD* t,DHP* p)//根据需要删除的地址删除联系人
{
if(p->fron==NULL && p->rear==NULL)
{
t->first=NULL;
t->last=NULL;
free(p);
}
else if(p->fron==NULL)
{
t->first=p->rear;
t->first->fron=NULL;
free(p);
}
else if(p->rear==NULL)
{
t->last=p->fron;
t->last->rear=NULL;
free(p);
}
else
{
p->fron->rear=p->rear;
p->rear->fron=p->fron;
free(p);
}
}
void xingmingpx(DHPD* t,int n)//根据联系人首字母进行排序
{
char x[20],h[20];
DHPD m=(*t);
int i,j;
for(i=1;i<n;i++)
{
(*t)=m;
for(j=1;j<=(n-i);j++)
{
if(strcmp(t->first->name,t->first->rear->name)>0)
{
strcpy(x,t->first->name);
strcpy(t->first->name,t->first->rear->name);
strcpy(t->first->rear->name,x);
strcpy(h,t->first->tel);
strcpy(t->first->tel,t->first->rear->tel);
strcpy(t->first->rear->tel,h);
}
t->first=t->first->rear;
}
}
(*t)=m;
}
void xianshi(DHPD* t,int r)//显示电话簿所有联系人信息
{
int n=1;
DHP* p=t->first;
while(r--)
{
printf("联系人%d\n",n++);
printf("姓名————%s\n",p->name);
printf("电话号码——%s\n",p->tel);
p=p->rear;
}
}
void xianshilittle(DHP* p)
{
printf("联系人\n");
printf("姓名————%s\n",p->name);
printf("电话号码——%s\n",p->tel);
}
//根据联系人更改电话号码功能
//根据电话号码更改联系人功能
int main()
{
char name[20],tel[20];
int u=1,r,b,w;
DHP *e;
DHPD* t=dianhuapuchushihua();
loop:printf("请输入对应编号进行操作\n");
printf("1.添加联系人\n2.显示电话簿\n3.联系人查找\n4.电话簿排序\n5.删除联系人\n0.退出电话簿\n");
scanf("%d",&b);
getchar();
switch(b)
{
case 1:
while(u)
{
printf("请输入姓名\n");
scanf("%s",name);
printf("请输入号码\n");
scanf("%s",tel);
t=lxrweicha(t,name,tel);
printf("继续存入输入1,退出输入0\n");
scanf("%d",&u);
getchar();//头尾指针初始化
}
goto loop;
case 2:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
printf("电话簿\n");
xianshi(t,r);
goto loop;
}
case 3:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
loop2:printf("请输入对应编号进行操作\n");
printf("1.按姓名查找\n2.按号码查找\n3.按位置查找0.返回主界面\n");
scanf("%d",&w);
getchar();
if(w==1)
{
scanf("%s",name);
e=lianxirenchazhao(t,name,r);
if(e==NULL)
{
printf("未找到对应姓名\n");
goto loop2;
}
xianshilittle(e);
goto loop;
}
else if(w==2)
{
scanf("%s",tel);
e=haomachazhao(t,tel,r);
if(e==NULL)
{
printf("未找到对应号码\n");
goto loop2;
}
xianshilittle(e);
goto loop;
}
else if(w==3)
{
printf("请输入位置\n");
scanf("%d",&w);
if(r<w || w<1)
{
printf("不存在该位置\n");
goto loop2;
}
e=weizhichazhao(t,w);
xianshilittle(e);
goto loop;
}
goto loop2;
}
case 4:
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
xingmingpx(t,r);
goto loop;
}
case 5://联系人删除
r=lianxirenshuliang(t);
if(r==0)
{
printf("电话簿中暂无数据,请存储后再试\n\n");
goto loop;
}
else
{
loop1:printf("请输入对应编号进行操作\n");
printf("1.按姓名删除\n2.按号码删除\n3.按位置删除0.返回主界面\n");
scanf("%d",&w);
getchar();
if(w==1)
{
scanf("%s",name);
e=lianxirenchazhao(t,name,r);
if(e==NULL)
{
printf("未找到对应姓名\n");
goto loop1;
}
deletelxr(t,e);
printf("删除成功\n");
goto loop;
}
else if(w==2)
{
scanf("%s",tel);
e=haomachazhao(t,tel,r);
if(e==NULL)
{
printf("未找到对应号码\n");
goto loop1;
}
deletelxr(t,e);
printf("删除成功\n");
goto loop;
}
else if(w==3)
{
printf("请输入位置\n");
scanf("%d",&w);
if(r<w || w<1)
{
printf("不存在该位置\n");
goto loop1;
}
e=weizhichazhao(t,w);
deletelxr(t,e);
printf("删除成功\n");
goto loop;
}
goto loop1;
}
case 0:
return 0;
}
goto loop;
}