数据结构单链表通讯录Word文档格式.docx
《数据结构单链表通讯录Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构单链表通讯录Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
stdlib.h>
string.h>
#defineNewsp(TxlList*)malloc(sizeof(structTxlList))
typedefstructTxlList
{
charName[16];
//姓名
charMTel[11];
//手机号
charTel[9];
//固定电话
charEMail[16];
//邮箱地址
charBornAddr[20];
//籍贯(值域:
"
北京"
、"
上海"
大连"
等等,只写城市名称)
charBroadN[50];
//博客名
structTxlList*next;
//指针域
}TxlList,*TxlLink;
voidLbuild1(TxlLink&
T){//创建文件
FILE*fp;
TxlLinkq;
q=Newsp;
q=T;
intNUM;
charfilename[20];
printf("
\n*请输入要创建的通讯录名:
\n"
);
gets(filename);
if((fp=fopen(filename,"
wb"
))==NULL){/*以写方式在当前目录打开(新建)文件*/
printf("
can'
topenfile\n"
exit(0);
//如果文件无法打开,关闭已经打开的其它文件,结束程序。
}
printf("
*请输入要储存的人数:
scanf("
%d"
&
NUM);
getchar();
for(inta=0;
a<
NUM;
a++){
TxlLinkp;
p=Newsp;
\n*请输入第%d个人的数据,按回车键结束,数据若为空请输“无”"
a+1);
printf("
\n*姓名:
gets(p->
Name);
*手机号:
MTel);
*固定电话:
Tel);
*邮箱地址:
EMail);
*籍贯:
BornAddr);
*博客名:
BroadN);
p->
next=NULL;
q->
next=p;
q=q->
next;
if(fprintf(fp,"
%s%s%s%s%s%s\n"
p->
Name,p->
MTel,p->
Tel,p->
EMail,p->
BornAddr,p->
BroadN)==1)//向文件中一次写一个结构体量值
{
printf("
filewriteerror\n"
break;
}
fclose(fp);
}
voidLbuild2(TxlLink&
T){//读取文件
TxlLinkq;
q=Newsp;
q=T;
charfilename[20];
printf("
\n*请输入要读取的通讯表名:
gets(filename);
if((fp=fopen(filename,"
rb"
))==NULL){
exit(0);
}
while(!
feof(fp)){
TxlLinkp;
p=Newsp;
fscanf(fp,"
%s%s%s%s%s%s"
q->
p->
q=q->
fclose(fp);
voidBuild(TxlLink&
T){//选择建立方式的函数
intChoice;
*******************************************************************"
);
\n*请输入想要实现的功能编号:
*1.新建通讯录;
\n*2.输出已有有通讯录;
\n*其它-退出。
\n*选择为:
scanf("
Choice);
getchar();
switch(Choice){
case1:
{
Lbuild1(T);
break;
}
case2:
{
Lbuild2(T);
break;
default:
{
无通讯录\n\n"
break;
}
voidUpdate(TxlLink&
T,char*Name,char*MTel){//将姓名为Name的好友的手机号改为MTel;
TxlLinkp;
p=T->
while(p){
if(strcmp(p->
Name,Name)==0){
strcpy(p->
MTel,MTel);
p=p->
voidBuildnew(TxlLink&
T){//创建一个空资料单元
chara[]="
无"
;
strcpy(T->
Name,a);
MTel,a);
EMail,a);
BornAddr,a);
BroadN,a);
Tel,a);
T->
voidOutPut(TxlLinkT){//输出通讯表数据
p=Newsp;
\n*通讯录信息:
\n姓名,手机号,固定电话,邮箱地址,籍贯,博客名分别为:
voidSort(TxlLink&
T){//将该通讯录按照好友姓名进行非递减排序
TxlLinkp,q,r;
p=T;
q=p->
intSUM=0;
while(q){//记录通讯表数据个数
SUM++;
q=q->
for(inti=0;
i<
SUM;
i++){
for(intj=0;
j<
SUM-i;
j++){
r=q->
if(r){
if(strcmp(q->
Name,r->
Name)>
0){
next=r;
next=r->
r->
next=q;
p=p->
q=p->
p=T;
q=p->
r=q->
voidMerge(TxlLink&
T1,TxlLink&
T2){//将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个
Sort(T1);
Sort(T2);
TxlLinkp,q,r,t,head;
p=T1->
q=T2->
head=T1;
while(p||q){
r=p;
t=q;
if(strcmp(p->
Name,q->
0)
head->
next=t;
head=head->
w"
elseif(strcmp(p->
Name)<
else{
MTel,q->
MTel)>
0){
q=q->
head->
head=head->
elseif(strcmp(p->
MTel)<
else{
free(r);
x"
if(!
p){
while(q){
q){
while(p){
T2=T1;
voidInsert(TxlLink&
T,char*Name,char*MTel){//插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>
Name的结点放到该结点后面;
Sort(T);
intn=1;
r=Newsp;
Buildnew(r);
strcpy(r->
Name,Name);
while(q){
=0)
T->
r->
n=0;
=0){
n=0;
if(n==1){
p->
intCount(TxlLinkT){//统计籍贯是某地的好友人数;
intx=0;
charBornAddr[20];
*请输入要查询的地址:
gets(BornAddr);
BornAddr,BornAddr)==0)
x++;
returnx;
intNumber1(TxlLinkp,TxlLink&
r,TxlLink&
t,intk){//运用递归方法找到倒数第k个结点的地址
if(p){
q=p;
x=Number1(p,r,t,k)+1;
if(k==x)
r=q;
if((k+1)==x)
t=q;
intNumber2(TxlLinkp,TxlLink&
t,int&
k){//运用递归方法找到倒数第k个的地址
k++;
x=Number2(p,r,t,k)+1;
if((k/2)==x)
if((k/2+1)==x)
voidMoveK(TxlLink&
T,intk){//将通讯录中倒数第k个结点之后的所有结点移到头结点后面
intx;
TxlLinkp,q,r,t;
x=Number1(p,r,t,k);
t->
while(r){
q=r;
r=r->
q->
voidReverseN(TxlLinkT){//将通讯录的正中间位置结点之后的全部结点倒置
intk=0;
Number2(p,r,t,k);
intmain(void){
TxlLinkP;
intx=1;
P=Newsp;
Build(P);
while(x){
*1.排序;
\n*2.插入信息;
\n*3.更改手机;
\n*4.合并;
\n*5.统计籍贯人数;
\n*6.移节点;
\n*7.倒置链表;
\n*其它-退出。
switch(Choice)
case1:
\n************************排序前的通讯表*************************\n"
OutPut(P);
Sort(P);
\n************************排序后的通讯表*************************\n"
case2:
\n*************************插入前的通讯录*************************\n"
OutPut(P);
charname[16],mtel[11];
\n*请输入要插入的好友姓名:
gets(name);
\n*请输入要插入的好友号码:
gets(mtel);
Insert(P,name,mtel);
\n*************************插入后的通讯录*************************\n"
********************************************************************"
case3:
\n*************************改写前的通讯录*************************\n"
\n*请输入要改写的好友姓名:
\n*请输入要改写的好友号码:
Update(P,name,mtel);
\n*************************改写后的通讯录*************************\n"
}
case4:
TxlLinkQ;
Q=Newsp;
\n*建立另一个通讯录\n"
Build(Q);
\n*第一个通讯录\n"
\n*第二个通讯录\n"
OutPut(Q);
Merge(P,Q);
\n**********************合并并排序后的通讯录***********************\n"
case5:
intN;
\n***************************输出通讯录***************************\n"
N=Count(P);
\n*统计结果为:
\n*共%d个人\n"
N);
case6:
intn;
\n*请输入移动节点数:
\nn="
n);
\n*移动前的通讯录:
MoveK(P,n);
\n*移动后的通讯录:
case7:
\n*************************倒置前的通讯录*************************\n"
ReverseN(P);
\n*************************倒置后的通讯录*************************\n"
default:
x=0;
}
return0;