C语言版用链表实现通讯录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言版用链表实现通讯录
“标头.h”
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Len sizeof(Lnode)
int seat;//全局变量,用于存储通讯录成员信息typedef struct Lnode
{
int number; //学号
char name[20];//名字
double telenum;//电话
struct Lnode *next;//定义一个指向下一个节点的指针} Lnode,*LinkList;//把struct Lnode*重定义为LinkList
LinkList creatIncreLink();
void deleteElem(LinkList l,int i);
int delName(LinkList l,char name[]);
int delNum(LinkList l,int n);
void insertYouxu(LinkList l,LinkList Elem);
void printList(LinkList l);
LinkList prior(LinkList l,LinkList p);
int searchName(LinkList l,char name[]);
int searchNum(LinkList l,int n);
#include<stdio.h>
#include"标头.h"
LinkList creatIncreLink()
{
LinkList p;
int num=1,number;
double telenum;
char name[20],temp;
LinkList L,P;
L=(LinkList)malloc(Len); //创建头结点
L->next = NULL;
printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结果标志\n");
printf("请输入学号 %d:");
scanf("%d",&number);
printf("请输入姓名 %d:");
temp=getchar();
gets(name);
printf("请输入电话号码 %d:");
scanf("%lf",&telenum);
while (number >= 0)
{
p = (LinkList)malloc(Len); //新分配结点
p->number = number;
p->telenum = telenum;
strcpy(p->name,name);
insertYouxu(L,p); //有序地插入新结点
num++;
printf("请输入学号 %d:",&num);
scanf("%d",&number);
printf("请输入姓名 %d:",num);
temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
}
return(L);
}
void deleteElem(LinkList l,int i) //删除函数
{
LinkList p=l,q;//让p指向l
int j=0;//循环变量j
while(p->next&&j<i-1) //循环让p指向第i个元素的前驱 {
p=p->next;
j++;
}
if(p->next==0) //判断下一个元素是否为空
printf("ERROR");
q=p->next;//将p指向第i个元素
p->next=q->next;//p的next指向q的next
free(q);//释放q链表
}
int delName(LinkList l,char name[])
{
int flag=0;
LinkList p=l->next;
seat=1;
if(l->next==NULL)
printf("该链表中没有元素");
else
{
while(p!=NULL)
{
if(strcmp(p->name,name)!=0)
{
flag=1;
printf("%s",p->name);
p=p->next;
deleteElem(l,seat);
}
else
{
p=p->next;seat++;
}
}
if(flag==1)
printf("被删除");
}
return flag;
}
int delNum(LinkList l,int n)
{
int flag=0;
LinkList p=l->next;
seat=1;
if(l->next==NULL)
printf("没有元素");
else
{
while(p!=NULL)
{
if(p->number<=n)
{
if(p->number==n)
{
flag=1;
printf("%d",p->number);
p=p->next;
deleteElem(l,seat);
}
}
else
{
p=p->next;
seat++;
}
}
printf("被删除");
}
return flag;
}
void insertYouxu(LinkList l,LinkList Elem)
{
LinkList p=l->next;
while(p!=NULL&&Elem->number>=p->number) {
if(p->number==Elem->number)
{
printf("重复输入\n");
return;
}
p=p->next;
}
if(p==NULL)
{
p=prior(l,p);
Elem->next=NULL;
p->next=Elem;
}
else
{
p=prior(l,p);
Elem->next=p->next;
p->next=Elem;
}
}
void printList(LinkList l)
{
LinkList p=l;
int n=1;
printf("内容");
if(l==NULL||l->next==NULL)
printf("没有元素\n");
else
while(p->next!=NULL)
{
printf(" - %-9d",n,p->next->number);
printf(" %-5s %.0f\n",p->next->name,p->next->telenum); p=p->next;
n++;
}
}
LinkList prior(LinkList l, LinkList p)
{
LinkList p_prior=l;
if(l->next==NULL)
return(l);
while(p_prior->next!=p)
p_prior=p_prior->next;
return(p_prior);
}
int searchName(LinkList l,char name[])
{
int flag=0;
LinkList p=l->next;
seat=1;
if(l->next==NULL||l==NULL)
printf("查找失败");
else
{
while(p!=NULL)
{
if(!strcmp(p->name,name))
{
flag=1;
printf("要查找的是%d位通讯录成员\n",seat);
printf("学号:%d 名字:%s 电话:%f\n",p->number,p->name,p->telenum); }
p->next;seat++;
}
}
return flag;
}
int searchNum(LinkList l,int n)
{
int flag=0;
LinkList p=l->next;
seat=1;
if(l->next==NULL)
printf("查找失败");
else
{
while(p!=NULL)
{
if(p->number<=n)
if(p->number==n)
{
flag=1;
printf("要查找的是%d个成员\n",seat);
printf("学号:%d 姓名:%s 电话:%f",p->number,p->telenum,p->telenum); }
p=p->next;seat++;
}
}
return flag;
}
int main(void)
{
LinkList l=NULL,p;
int flag=0;
int menu;
char temp;
system("color 3f");
printf("输入1通讯录的建立\n");
printf("输入2插入通讯录\n");
printf("输入3查询通讯录\n");
printf("输入4删除通讯录\n");
printf("输入5显示通讯录信息\n");
printf("输入0退出\n");
scanf("%d",&menu);
while(menu!=0)
{
switch(menu)
{
case 1:l=creatIncreLink();
printf("建立通讯录\n");
printList(l);flag=1;break;
case 2:if(flag==1)
{
int number;
double telenum;
char name[20];
char temp;
printf("请输入学号\n");
scanf("%d",&number);
printf("请输入姓名\n");
scanf("%s",&name[20]);
printf("请输入电话号码");
scanf("%f",&telenum);
p=(LinkList)malloc(Len);
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYouxu(l,p);
printf("插入后\n");
printList(l);
}
else
{
printf("error\n");
}
break;
case 3:
int way,n,s;
char na[20],temp;
if(l!=NULL)
{
if(flag)
{
printf("选择查找方式1,按学号查找2按姓名"); scanf("%d",&way);
if(way==1)
{
printf("请输入学号\n");
scanf("%d",&n);
s=searchNum(l,n);
if(s==0)
printf("shibai");
}
else if(way==2)
{
printf("请输入姓名");
temp=getchar();
gets (na);
s=searchName(l,na);
if(s==2)printf("失败");
}
else printf("无记录");
}
break;
}
else printf("无记录");
break;
case 4:
printf("1,按序号删除2 按学号,3按姓名\n"); scanf("%d",&way);
if(way==1)
{
int n;
printf("请输入序号");
scanf("%d",&n);
printf("删除后\n");
deleteElem(l,n);
printList(l);
}
else if(way==2)
{
int n,f;
printf("请输入学号");
scanf("%d",&n);
f=delNum(l,n);
if(f!=0)
{
printf("删除后");
printList(l);
}
else printf("失败");
}
else if(way==3)
{
char na[20],temp;
int f;
printf("输入姓名");
temp=getchar();
gets(na);
f=delName(l,na);
if(f!=0)
{
printf("删除后");
printList(l);
}
else printf("失败");
}
else printf("error\n");break;
case 5:
printf("内容如下\n");
printList(l);break;
case 0:
exit(0);
default:printf("重新输入"); }
printf("选择\n");
scanf("%d",&menu);
}
}。