我想要个用c++创建通讯录的算法
1个回答
展开全部
我就详细的给你介绍一下
如果你觉得不错就顶一下,让更多的人知道欢迎访问我的博客 http://hi.baidu.com/不完美的bb/home
主要任务:
1. 建立双链表,并完成双链表的删除,插入,查询
2. 在输入联系人的信息的时候,例如,输入姓名,学号或是通讯地址时可以输出联系人的信息。
需求分析
1. 要建立一个双链表,目的是用其充当一个容器,要将联系人的信息储存在里面,之所以选择双链表是因为它的内存是不固定的可以根据客户的需求来自己开辟空间。
2. 双链表可以用类封装,也可以使用结构体实现。
3. 创建的通讯录要实现用户自己可以方便的创建结点,可以方便的实现插入,删除,查询基本动作。
概要设计:
1. 创建一个空的双链表可以使用Type creat(int n);函数传入的n是要创建的节点数,根据用户的需求初始化这个表。
2. 插入一个联系人的信息可以使用Type insert(type pos,type item);
3. 查询联系人信息可以使用Type search(type pos,type item);输入一个联系人的名字,然后在表里面查询这个人的信息。
4. 删除联系人的信息可以使用Type delete();
5. 然后就是输出的界面设计,基本上要构建一个比较友好的界面,是使用者感觉比较好用。
程序设计;
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h> //exit()需要
#include <string.h> //字符串处理如strcmp()函数需要 //#include <conio.h> //clrscr()需要,但在VC6中好象不可用,在TB中可用 #include <malloc.h>
typedef struct node
{
char name[20];
long tel;
char adress;
struct node *llink,*rlink;
}stud; //创建链表
stud * creat(int n)
{
stud *p,*head,*s;
int i;
if((head=(stud *)malloc(sizeof(stud)))==NULL)
{ printf("不能分配内存空间!\n");
exit(0);}
head->name[0]='\0';
head->llink=NULL;
head->rlink=NULL;
p=head;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!\n");
exit(0);
}
p->rlink=s;
printf("请输入第%d个人的姓名\n",i+1);
gets(s->name);
printf("请输入第%d个人的手机号码\n",i+1);
cin>>s->tel;
printf("请输入第%d个人的地址\n",i+1);
cin>>s->adress;
s->llink=p;
s->rlink=NULL;
p=s;
}
return(head);
}
//查找结点
stud * search(stud *head,char *name)
{
stud *p;
p=head;
while(p->rlink!=NULL)
{
if(strcmp(p->rlink->name,name)==0)
return(p->rlink);
p=p->rlink;
}
return NULL;
//printf("没有查找到该数据!");
}//插入结点,返回链表头结点
stud * insert(stud * head,char * name)
{
stud *insert=NULL;
stud *ptr=NULL;
insert=(stud *)malloc(sizeof(stud));
strcpy(insert->name,name);
ptr=head;
if (ptr->llink==NULL && ptr->rlink==NULL) //空链表时
{
ptr->rlink=insert;
insert->llink=ptr;
insert->rlink=NULL;
return head;
}
if (strcmp(insert->name,ptr->rlink->name)<0) //要插入的结点为头结点
{
insert->rlink=ptr->rlink;
ptr->rlink->llink=insert;
ptr->rlink=insert;
insert->llink=ptr;
return head;
}
while(ptr->rlink!=NULL && strcmp(insert->name,ptr->rlink->name)>0) //查找插入点
{
ptr=ptr->rlink;
printf("%s",ptr->name);
}
printf("test1");
if (ptr->rlink==NULL) //要插入的结点是尾结点
{
printf("test2");
ptr->rlink=insert;
insert->llink=ptr;
insert->rlink=NULL;
return head;
}
else //要插入的结点是中间某结点
{
insert->rlink=ptr->rlink;
ptr->rlink->llink=insert;
ptr->rlink=insert;
insert->llink=ptr;
}
return head;
}
//删除结点
stud * deleted(stud *head ,char name[]) //删除链表
{
stud *delet=NULL;
if (head->llink==NULL && head->rlink==NULL)
{
printf("链表空! \n");
return NULL;
}
if ((delet=search(head,name))==NULL)
{
printf("找不到该姓名! \n");
return NULL;
}
else
{
if (delet==head) //要删除的结点为头结点
{
head=delet->rlink;
delet->rlink->llink=NULL;
}
else if(delet->rlink==NULL) //要删除的结点为尾结点
delet->llink->rlink=NULL;
else //否则为中间结点
{
delet->llink->rlink=delet->rlink;
delet->rlink->llink=delet->llink;
}
}
return head;
}
//输出链表
void print(stud *head)
{
stud *p;
p=head;
if (p==NULL || p->llink==NULL && p->rlink==NULL)
printf("链表为空!\n");
else
{
printf("链表为:\n");
while(p->rlink!=NULL)
{
printf("%s\n",&*(p->rlink->name));
p=p->rlink;
}
//printf("\n");
}
}
//测试程序
main()
{
int number,num; //number,插入的结点数,num,菜单的选项
char studname[20];
stud *head,*searchpoint=NULL;
if((head=(stud *)malloc(sizeof(stud)))==NULL) //定义头指针
{
printf("不能分配内存空间!\n");
exit(0);
}
head->name[0]='\0';
head->llink=NULL;
head->rlink=NULL;
system("cls");//clrscr();
while (1)
{
printf("\t欢迎来到bb个人通讯录首页,选择你要执行的操作\n");
printf("\t* 1、创建链表 *\n");
printf("\t* 2、查找一个结点 *\n");
printf("\t* 3、插入一个结点 *\n");
printf("\t* 4、删除一个结点 *\n");
printf("\t* 5、输出链表 *\n");
printf("\t* 6、退出 *\n");
printf("\t每天拥有好心情哦!\n");
printf("\t请从菜单中选择(1 or 2 or 3 or 4 or 5 or 6):\n");
scanf("%d",&num);
getchar(); //跳过回车符,因为后面使用了gets函数,接收一个可以带空格的姓名
switch(num)
{
case 1: //创建链表
printf("***************Now, creating a double linked list**************************\n");
printf("请输入要创建链表的结点数:\n");
scanf("%d",&number);
getchar(); //跳过回车符
head=creat(number);
break;
case 2: //查找一个结点
printf("***************Now, finding a double linked list**************************\n");
printf("请输入你要查找的人的姓名:\n");
gets(studname);
if ((searchpoint=search(head,studname))!=NULL)
printf("你所要查找的人已找到:\n%s\n,%d\n,%s\n",*&searchpoint->name,*&searchpoint->tel,*&searchpoint->adress);
else
printf("没找到你输入的姓名!\n");
break;
case 3: //插入一个结点
printf("***************Now, inserting a double linked list**************************\n");
printf("请输入你要插入到链表的姓名:\n");
gets(studname);
insert(head,studname);
break ;
case 4: //删除一个结点
printf("***************Now, deleting a double linked list**************************\n");
printf("请输入你要删除的人的姓名:\n");
gets(studname);
deleted(head,studname);
break;
case 5: //输出链表
printf("***************Now, output a double linked list**************************\n");
print(head);
break;
case 6:
exit(0);
default:
printf("输入错误,请重新输入!\n");
}
}
}
如果你觉得不错就顶一下,让更多的人知道欢迎访问我的博客 http://hi.baidu.com/不完美的bb/home
主要任务:
1. 建立双链表,并完成双链表的删除,插入,查询
2. 在输入联系人的信息的时候,例如,输入姓名,学号或是通讯地址时可以输出联系人的信息。
需求分析
1. 要建立一个双链表,目的是用其充当一个容器,要将联系人的信息储存在里面,之所以选择双链表是因为它的内存是不固定的可以根据客户的需求来自己开辟空间。
2. 双链表可以用类封装,也可以使用结构体实现。
3. 创建的通讯录要实现用户自己可以方便的创建结点,可以方便的实现插入,删除,查询基本动作。
概要设计:
1. 创建一个空的双链表可以使用Type creat(int n);函数传入的n是要创建的节点数,根据用户的需求初始化这个表。
2. 插入一个联系人的信息可以使用Type insert(type pos,type item);
3. 查询联系人信息可以使用Type search(type pos,type item);输入一个联系人的名字,然后在表里面查询这个人的信息。
4. 删除联系人的信息可以使用Type delete();
5. 然后就是输出的界面设计,基本上要构建一个比较友好的界面,是使用者感觉比较好用。
程序设计;
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h> //exit()需要
#include <string.h> //字符串处理如strcmp()函数需要 //#include <conio.h> //clrscr()需要,但在VC6中好象不可用,在TB中可用 #include <malloc.h>
typedef struct node
{
char name[20];
long tel;
char adress;
struct node *llink,*rlink;
}stud; //创建链表
stud * creat(int n)
{
stud *p,*head,*s;
int i;
if((head=(stud *)malloc(sizeof(stud)))==NULL)
{ printf("不能分配内存空间!\n");
exit(0);}
head->name[0]='\0';
head->llink=NULL;
head->rlink=NULL;
p=head;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!\n");
exit(0);
}
p->rlink=s;
printf("请输入第%d个人的姓名\n",i+1);
gets(s->name);
printf("请输入第%d个人的手机号码\n",i+1);
cin>>s->tel;
printf("请输入第%d个人的地址\n",i+1);
cin>>s->adress;
s->llink=p;
s->rlink=NULL;
p=s;
}
return(head);
}
//查找结点
stud * search(stud *head,char *name)
{
stud *p;
p=head;
while(p->rlink!=NULL)
{
if(strcmp(p->rlink->name,name)==0)
return(p->rlink);
p=p->rlink;
}
return NULL;
//printf("没有查找到该数据!");
}//插入结点,返回链表头结点
stud * insert(stud * head,char * name)
{
stud *insert=NULL;
stud *ptr=NULL;
insert=(stud *)malloc(sizeof(stud));
strcpy(insert->name,name);
ptr=head;
if (ptr->llink==NULL && ptr->rlink==NULL) //空链表时
{
ptr->rlink=insert;
insert->llink=ptr;
insert->rlink=NULL;
return head;
}
if (strcmp(insert->name,ptr->rlink->name)<0) //要插入的结点为头结点
{
insert->rlink=ptr->rlink;
ptr->rlink->llink=insert;
ptr->rlink=insert;
insert->llink=ptr;
return head;
}
while(ptr->rlink!=NULL && strcmp(insert->name,ptr->rlink->name)>0) //查找插入点
{
ptr=ptr->rlink;
printf("%s",ptr->name);
}
printf("test1");
if (ptr->rlink==NULL) //要插入的结点是尾结点
{
printf("test2");
ptr->rlink=insert;
insert->llink=ptr;
insert->rlink=NULL;
return head;
}
else //要插入的结点是中间某结点
{
insert->rlink=ptr->rlink;
ptr->rlink->llink=insert;
ptr->rlink=insert;
insert->llink=ptr;
}
return head;
}
//删除结点
stud * deleted(stud *head ,char name[]) //删除链表
{
stud *delet=NULL;
if (head->llink==NULL && head->rlink==NULL)
{
printf("链表空! \n");
return NULL;
}
if ((delet=search(head,name))==NULL)
{
printf("找不到该姓名! \n");
return NULL;
}
else
{
if (delet==head) //要删除的结点为头结点
{
head=delet->rlink;
delet->rlink->llink=NULL;
}
else if(delet->rlink==NULL) //要删除的结点为尾结点
delet->llink->rlink=NULL;
else //否则为中间结点
{
delet->llink->rlink=delet->rlink;
delet->rlink->llink=delet->llink;
}
}
return head;
}
//输出链表
void print(stud *head)
{
stud *p;
p=head;
if (p==NULL || p->llink==NULL && p->rlink==NULL)
printf("链表为空!\n");
else
{
printf("链表为:\n");
while(p->rlink!=NULL)
{
printf("%s\n",&*(p->rlink->name));
p=p->rlink;
}
//printf("\n");
}
}
//测试程序
main()
{
int number,num; //number,插入的结点数,num,菜单的选项
char studname[20];
stud *head,*searchpoint=NULL;
if((head=(stud *)malloc(sizeof(stud)))==NULL) //定义头指针
{
printf("不能分配内存空间!\n");
exit(0);
}
head->name[0]='\0';
head->llink=NULL;
head->rlink=NULL;
system("cls");//clrscr();
while (1)
{
printf("\t欢迎来到bb个人通讯录首页,选择你要执行的操作\n");
printf("\t* 1、创建链表 *\n");
printf("\t* 2、查找一个结点 *\n");
printf("\t* 3、插入一个结点 *\n");
printf("\t* 4、删除一个结点 *\n");
printf("\t* 5、输出链表 *\n");
printf("\t* 6、退出 *\n");
printf("\t每天拥有好心情哦!\n");
printf("\t请从菜单中选择(1 or 2 or 3 or 4 or 5 or 6):\n");
scanf("%d",&num);
getchar(); //跳过回车符,因为后面使用了gets函数,接收一个可以带空格的姓名
switch(num)
{
case 1: //创建链表
printf("***************Now, creating a double linked list**************************\n");
printf("请输入要创建链表的结点数:\n");
scanf("%d",&number);
getchar(); //跳过回车符
head=creat(number);
break;
case 2: //查找一个结点
printf("***************Now, finding a double linked list**************************\n");
printf("请输入你要查找的人的姓名:\n");
gets(studname);
if ((searchpoint=search(head,studname))!=NULL)
printf("你所要查找的人已找到:\n%s\n,%d\n,%s\n",*&searchpoint->name,*&searchpoint->tel,*&searchpoint->adress);
else
printf("没找到你输入的姓名!\n");
break;
case 3: //插入一个结点
printf("***************Now, inserting a double linked list**************************\n");
printf("请输入你要插入到链表的姓名:\n");
gets(studname);
insert(head,studname);
break ;
case 4: //删除一个结点
printf("***************Now, deleting a double linked list**************************\n");
printf("请输入你要删除的人的姓名:\n");
gets(studname);
deleted(head,studname);
break;
case 5: //输出链表
printf("***************Now, output a double linked list**************************\n");
print(head);
break;
case 6:
exit(0);
default:
printf("输入错误,请重新输入!\n");
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询