用链表实现一个简单的电话号码簿
整体上用链表来实现简易的电话号码簿,所用数据的存储结构是链式存储结构,逻辑结构是线性结构。
**基本思路:**首先创建一个单链表,输入数据组数,之后输入相应组数的姓名与电话号码;再按照需求选择进行插入、删除数据以及电话号码簿的打印。
主函数里面调用创建链表函数(create_peo(LinkList &L,int n)),插入函数(insert_peo(LinkList &L,int i,LinkList &s))、删除函数(delete_peo(LinkList &L,int i,LinkList &e))、打印函数(print_peo(LinkList &L))。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char DataType;
typedef struct Node{ //线性表的单链表存储结构
struct {
char name[20];
char number[12];
}data; //定义结构变量
char name[20];
char number[12];
struct Node *next;
}LNode,*LinkList;
void create_peo(LinkList &L,int n); //创建单链表
int insert_peo(LinkList &L,int i,LinkList &s); //插入个人信息
int delete_peo(LinkList &L,int i,LinkList &e); //删除个人信息
void print_peo(LinkList &L); //打印
void exit_system(); //退出程序
int main()
{
int choice;
int n,i,j;
LinkList p=NULL;
LinkList L,s,e;
while(1)
{
printf("这是一个电话号码管理系统\n");
printf("1.创建链表\n");
printf("2.插入个人信息\n");
printf("3.删除个人信息\n");
printf("4.显示当前链表\n");
printf("0.退出\n");
printf("********************\n");
printf("请输入功能序号\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("输入你想创建的数据组数:");
scanf("%d",&n);
create_peo(L,n);
break;
case 2:
printf("请输入需要插入的位置:");
scanf("%d",&i);
insert_peo(L,i,s);
break;
case 3:
printf("输入你想删除的位置:");
scanf("%d",&i);
delete_peo(L,i,e);
break;
case 4:
print_peo(L);
break;
case 0:
exit_system();
break;
default:printf("输入有误,请重新输入:");
break;
}
}
return 0;
}
void create_peo(LinkList &L,int n)
{
//逆位序输入 n个元素的值,建立带表头结点的单链线性表L
LinkList p;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //先建立一个带头结点的单链表
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode)); //生成新结点
printf("请输入联系人姓名:");
scanf("%s",p->data.name);
printf("请输入联系人电话号码:");
scanf("%s",p->data.number); //输入元素值
p->next=L->next;
L->next=p; //插入到表头
}
} //create_L
int insert_peo(LinkList &L,int i,LinkList &s)
{ //在带头结点的单链线性表 L中第i个位置之前插入元素 e
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
} //寻找第 i-1个结点
if(!p||j>i-1)
{
printf("插入位置不合法!");
exit (1);
}
else
{
s=(LinkList)malloc(sizeof(LNode)); //生成新结点
printf("请输入需要插入的联系人姓名:");
scanf("%s",s->data.name);
printf("请输入需要插入的联系人电话:");
scanf("%s",s->data.number);
s->next=p->next; //插入 L中
p->next=s;
printf("您已添加成功!\n");
}
return 1;
}
int delete_peo(LinkList &L,int i,LinkList &e){//删除第i个结点
LinkList p=L,q;
int j=0;
while(p->next&&j<i-1)
{ //寻找第i个结点,并令p指向其前驱
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
{
printf("删除位置不合法");
exit(1);
}
else
{
q=p->next;
p->next=q->next;
e=q;
free(q);
printf("您已删除成功!\n");
}
}
void exit_system()
{
printf("退出中.....\n");
system("pause");
exit(0);
}
void print_peo(LinkList &L)
{//打印
LinkList p;
p=L;
printf("姓名\t\t电话\n\n");
while(p->next!=NULL){
p=p->next;
printf("%s\t%s\n",p->data.name,p->data.number);
}
}
①:选择1:创建一个链表,创建三组数据,分别输入这三组数据;再选择4:显示当前链表;
②:选择2:在指定位置插入一组数据,输入数据信息;再选择4:显示当前链表;
③:选择3:在指定位置进行删除操作;再选择4:显示当前链表。
------------------------------------------------END-------------------------------------------