数据结构电话号码本源程序(链表)
2015-07-17 09:03
246 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define ID struct tel
struct tel
{
char name[8];
char num[11];
ID * next;
};
int m=0;
ID* create()
{
ID *head,*p1,*p2;
void save(ID *head);
char flag;
head=p1=p2=NULL;
printf("欢迎使用电话簿管理系统,按#键结束请按提示使用\n");
while(1)
{
p1= (ID*)malloc(sizeof(ID));
printf("请输入姓名\n");
scanf("%s",p1->name);
if(strcmp(p1->name,"#")==0)
{
if(m==0)
{
printf("你输入了0条记录,单链表没有创建...\n");
free(p1);
return (head);
}
else
{
break;
}
}
printf("请输入电话号码: \n");
scanf("%s",p1->num);
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
m++;
}
p2->next=NULL;
free(p1);
printf("\n新建电话号码簿成功,共有%d个联系人,是否保存?Y/N \n",m);
getchar();
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save (head);
else
printf("\n请在退出程序之前,保存当前的编辑工作!\n");
return head;
}
void print(ID *head)
{
ID* temp;
temp=head;
system("cls");/*清屏*/
printf("姓名: \t电话号码:\n");
if(head==NULL)
{
printf("当前链表为空,请先创建新的链表或者加载文件\n");
} else
do
{
printf("%s\t%s\n",temp->name,temp->num);
temp=temp->next;
}while(temp!=NULL);
}
void save(ID *head)
{
FILE *fp;
ID* t ;
if ((fp=fopen("telephone.txt","w"))==NULL)
{
printf("打开文件失败!\n");
getch();
exit(1);
}
t=head;
while(t!=NULL)
{
fwrite(t,sizeof(ID),1,fp);
t=t->next;
}
fclose(fp);
printf("文件保存成功\n");
}
ID* delete_(ID *head)
{
int i;
int j=1;
ID *p,*q;
char flag;
p=head;
printf("请输入要删除的位置: ");
scanf("%d",&i);
while(p!=NULL && j<i-1 )
{
p=p->next;
++j;
}
if(p==NULL){ printf("删除位置错误\n"); return (head);}
if (i==1)
{
head=head->next;
}
else{
q=p->next;
p->next=q->next;
free(q);
}
printf("删除电话号码成功,是否存盘?Y/N?\n");
getchar();/*吸收回车*/
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!\n");
return(head);
}
ID* Initlist(ID* head)
{
ID *p;
if(!head)
{
return 0;
printf("分配存储失败\n");
}
else
while (head->next!=NULL)
{
p=head->next;
head->next=p->next;
}
free(head);
printf("文件已清空\n");
return 0;
}
/*插入*/
ID* append(ID* head)
{
int j=0;
int i;
char flag;
ID *p,*info;
p=head;
info=(ID*)malloc(sizeof(ID));
system("cls");
printf("请输入添加的姓名:");
scanf("%s",info->name);
printf("请输入添加的号码:");
scanf("%s",info->num);
printf("请输入你要插入的位置:");
scanf("%d",&i);
while(p!=NULL && j<i-2 )
{
p=p->next;
j++;
}
if(p==NULL || j>i-1) { printf("插入位置错误\n"); return (head);}
if(i==1){
info->next=head;
head=info;
}
else{
info->next=p->next;
p->next=info;
}
printf("新添加电话号码成功,是否存盘?Y/N?\n");
getchar();/*吸收回车*/
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!\n");
return(head);
}
int main()
{
ID *head=NULL; /*struct tel * head;*/
int choice; /*代表用户的选择*/
w
4000
hile(1) /*死循环*/
{
printf("\n");
printf("\n");
printf("\n");
printf("\t\t **********电话簿管理系统**********\n");
printf("\t\t **** 0 create 建立新的电话号码簿 ****\n");
printf("\t\t **** 1 delete 删除新的电话号码 ****\n");
printf("\t\t **** 2 print 打印电话号码 ****\n");
printf("\t\t **** 3 save 保存电话号码簿 ****\n");
printf("\t\t **** 4 append 插入新的电话号码 ****\n");
printf("\t\t **** 5 Initlist 清空电话号码簿 ****\n");
printf("\t\t **** 6 exit 退出电话号码簿系统 ****\n");
printf("\t\t **********//请按提示使用**********\n");
scanf("%d",&choice);
getchar(); /*吸收回车*/
switch(choice)
{
case 0: head=create(); break;
case 1: head=delete_(head); break;
case 2: print(head); break;
case 3: save(head); break;
case 4: head=append(head); break;
case 5: head=Initlist(head); break;
case 6: exit(0);break;
default:printf("选择错误,请在0-6之间选择\n");
}
}
return 0;
}
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define ID struct tel
struct tel
{
char name[8];
char num[11];
ID * next;
};
int m=0;
ID* create()
{
ID *head,*p1,*p2;
void save(ID *head);
char flag;
head=p1=p2=NULL;
printf("欢迎使用电话簿管理系统,按#键结束请按提示使用\n");
while(1)
{
p1= (ID*)malloc(sizeof(ID));
printf("请输入姓名\n");
scanf("%s",p1->name);
if(strcmp(p1->name,"#")==0)
{
if(m==0)
{
printf("你输入了0条记录,单链表没有创建...\n");
free(p1);
return (head);
}
else
{
break;
}
}
printf("请输入电话号码: \n");
scanf("%s",p1->num);
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
m++;
}
p2->next=NULL;
free(p1);
printf("\n新建电话号码簿成功,共有%d个联系人,是否保存?Y/N \n",m);
getchar();
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save (head);
else
printf("\n请在退出程序之前,保存当前的编辑工作!\n");
return head;
}
void print(ID *head)
{
ID* temp;
temp=head;
system("cls");/*清屏*/
printf("姓名: \t电话号码:\n");
if(head==NULL)
{
printf("当前链表为空,请先创建新的链表或者加载文件\n");
} else
do
{
printf("%s\t%s\n",temp->name,temp->num);
temp=temp->next;
}while(temp!=NULL);
}
void save(ID *head)
{
FILE *fp;
ID* t ;
if ((fp=fopen("telephone.txt","w"))==NULL)
{
printf("打开文件失败!\n");
getch();
exit(1);
}
t=head;
while(t!=NULL)
{
fwrite(t,sizeof(ID),1,fp);
t=t->next;
}
fclose(fp);
printf("文件保存成功\n");
}
ID* delete_(ID *head)
{
int i;
int j=1;
ID *p,*q;
char flag;
p=head;
printf("请输入要删除的位置: ");
scanf("%d",&i);
while(p!=NULL && j<i-1 )
{
p=p->next;
++j;
}
if(p==NULL){ printf("删除位置错误\n"); return (head);}
if (i==1)
{
head=head->next;
}
else{
q=p->next;
p->next=q->next;
free(q);
}
printf("删除电话号码成功,是否存盘?Y/N?\n");
getchar();/*吸收回车*/
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!\n");
return(head);
}
ID* Initlist(ID* head)
{
ID *p;
if(!head)
{
return 0;
printf("分配存储失败\n");
}
else
while (head->next!=NULL)
{
p=head->next;
head->next=p->next;
}
free(head);
printf("文件已清空\n");
return 0;
}
/*插入*/
ID* append(ID* head)
{
int j=0;
int i;
char flag;
ID *p,*info;
p=head;
info=(ID*)malloc(sizeof(ID));
system("cls");
printf("请输入添加的姓名:");
scanf("%s",info->name);
printf("请输入添加的号码:");
scanf("%s",info->num);
printf("请输入你要插入的位置:");
scanf("%d",&i);
while(p!=NULL && j<i-2 )
{
p=p->next;
j++;
}
if(p==NULL || j>i-1) { printf("插入位置错误\n"); return (head);}
if(i==1){
info->next=head;
head=info;
}
else{
info->next=p->next;
p->next=info;
}
printf("新添加电话号码成功,是否存盘?Y/N?\n");
getchar();/*吸收回车*/
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!\n");
return(head);
}
int main()
{
ID *head=NULL; /*struct tel * head;*/
int choice; /*代表用户的选择*/
w
4000
hile(1) /*死循环*/
{
printf("\n");
printf("\n");
printf("\n");
printf("\t\t **********电话簿管理系统**********\n");
printf("\t\t **** 0 create 建立新的电话号码簿 ****\n");
printf("\t\t **** 1 delete 删除新的电话号码 ****\n");
printf("\t\t **** 2 print 打印电话号码 ****\n");
printf("\t\t **** 3 save 保存电话号码簿 ****\n");
printf("\t\t **** 4 append 插入新的电话号码 ****\n");
printf("\t\t **** 5 Initlist 清空电话号码簿 ****\n");
printf("\t\t **** 6 exit 退出电话号码簿系统 ****\n");
printf("\t\t **********//请按提示使用**********\n");
scanf("%d",&choice);
getchar(); /*吸收回车*/
switch(choice)
{
case 0: head=create(); break;
case 1: head=delete_(head); break;
case 2: print(head); break;
case 3: save(head); break;
case 4: head=append(head); break;
case 5: head=Initlist(head); break;
case 6: exit(0);break;
default:printf("选择错误,请在0-6之间选择\n");
}
}
return 0;
}
相关文章推荐
- 数据结构电话号码本源代码(顺序表)
- 详解《数据结构题集(C语言版)》算法设计题(01-16)
- 数据结构基础温故-4.树与二叉树(下)
- MD中bitmap源代码分析--数据结构
- 跟我学数据结构之算法初步概念
- 权限管理数据结构设计
- PAT 数据结构 06-图7. How Long Does It Take (25) 拓扑排序 最早开始时间
- 算法导论 第十四章:区间树
- 算法导论 第十四章:数据结构的扩张
- PAT 数据结构 06-图6. 公路村村通(30)Prim最小生成树算法
- 数据结构复习之树
- 数据结构之位图
- 数据结构与算法分析 note
- 数据结构与算法五
- 数据结构与算法四
- 数据结构与算法三
- 数据结构与算法二
- 数据结构与算法一
- 线索化二叉树
- 跟我学数据结构之基本概念