本文已参加「新人创造礼」活动,一起敞开创造之路。
通讯录办理体系是链表的常用应用,也是咱们必需要掌握的一个用链表完成的小项目制作。 下面来看代码
#include <stdlib.h>
typedef struct //界说每个人员信息结构体
{
char num[5]; //编号
char name[9];//名字
char sex[3]; //性别
char phone[13]; //电话
char addr[31]; //地址
}DataType;
typedef struct node //界说链表类型
{
DataType data; //数据域
struct node *next; //指针域
}ListNode;
typedef ListNode *LinkList;
void CreateList(LinkList &L,int m)//通讯录链表的树立
{ int i;
LinkList s,r;
L=(LinkList)malloc(sizeof(ListNode));
L->next=NULL;
r=L; //尾节点
for(i=0;i<m;i++)
{ s=(LinkList)malloc(sizeof(ListNode)); //新建的节点
printf("输入第%d位编号:",i+1);
scanf("%s",&s->data.num);
printf("\n输入名字:");
scanf("%s",&s->data.name);
printf("\n输入性别:");
scanf("%s",&s->data.sex);
printf("\n输入电话:");
scanf("%s",&s->data.phone);
printf("\n输入地址:");
scanf("%s",&s->data.addr);
s->next=NULL;
r->next=s; //刺进尾节点之后
r=s;
}
}
int ListLength(LinkList L) //求通讯录链表的长度
{ LinkList p;
int length=0;
p=L->next;
while(p)
{ length++;
p=p->next;
}
return length;
}
int ListInsert(LinkList &L,int i,DataType d) //通讯录链表的刺进
{ LinkList p,s;
int length;
length=ListLength(L);
p=L->next;
int j=1;
if(!p||i>length+1) //如果是空表或许查询方位不符合要求
return 0;
while(p&&j<i-1) //使p指向要增加方位的前一个元素
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LinkList));
s->data=d;
s->next=p->next;
p->next=s;
return 1;
}
int ListDelete(LinkList &L,int i)
{ LinkList p,q;//p为要删去的前一个节点,q为要删去的节点
p=L;
int j=0;
int length;
length=ListLength(L);
if(!p||i>length) //如果是空表或许查询方位不符合要求
return 0;
while(p&&j<i-1) //使p指向要删去方位的前一个元素
{ p=p->next;
j++;
}
q=p->next; //q指向后一个元素
printf("\n被删去的人员信息为:\n");
printf("\n编号:%s 名字:%s 性别:%s 电话:%s 地址:%s",q->data.num,q->data.name,q->data.sex,q->data.phone,q->data.addr);
p->next=q->next;
return 1;
}
int GetElem(LinkList L,int i,DataType &d) //查询第i个成员信息
{ LinkList p;
p=L->next;
int j=1;
int length;
length=ListLength(L);
if(!p||i>length) //如果是空表或许查询方位不符合要求
return 0;
while(j<i)
{p=p->next;
j++;
}
d=p->data;
return 1;
}
void print(LinkList L) //打印通讯录人员信息
{ LinkList p;
p=L->next;
while(p)
{
printf("\n编号:%s 名字:%s 性别:%s 电话:%s 地址:%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
p=p->next;
}
}
void menu()
{ printf("--------------------------------------------1.通讯录链表的树立----------------------------------------------------------");
printf("\n--------------------------------------------2.通讯者节点的刺进----------------------------------------------------------");
printf("\n--------------------------------------------3.通讯者节点的查询----------------------------------------------------------");
printf("\n--------------------------------------------4.通讯者节点的删去----------------------------------------------------------");
printf("\n--------------------------------------------5.通讯录链表的输出----------------------------------------------------------");
printf("\n--------------------------------------------0.退出办理体系--------------------------------------------------------------");
}
int main()
{
LinkList L;
DataType d,d1;
int m,location,length,choose;
menu();
p:
printf("\n请输入你的选项:");
scanf("%d",&choose);
switch(choose)
{ case 1:printf("请输入通讯录人数:");scanf("%d",&m);CreateList(L,m);goto p;
case 2:printf("\n输入要刺进的方位:");scanf("%d",&location);printf("输入刺进人员的编号:"); scanf("%s",&d.num);printf("\n输入名字:"); scanf("%s",&d.name); printf("\n输入性别:");scanf("%s",&d.sex);printf("\n输入电话:");scanf("%s",&d.phone);printf("\n输入地址:");scanf("%s",&d.addr);ListInsert(L,location,d);goto p;
case 3:printf("\n请输入查询方位");scanf("%d",&location);GetElem(L,location,d); printf("查询到的人员信息为:\n");printf("\n编号:%s 名字:%s 性别:%s 电话:%s 地址:%s",d.num,d.name,d.sex,d.phone,d.addr);goto p;
case 4:printf("\n输入要删去的方位:");scanf("%d",&location);ListDelete(L,location);goto p;
case 5:print(L);goto p;
case 0:printf("体系已退出。");exit(0);
default:printf("输入错误,请重新输入");goto p;
}
return 0;
}