题目:
一.需求功能说明
编写程序,实现动态链表的插入、删除、输出、查找、统计以及销毁功能。
动态链表的每个节点存储某个有效联系人的信息,包括:序号、姓名、性别、分类、录入时间 以及家庭住址。
个人信息结构体的定义如下:
enum gender {male, female};//枚举
typedef struct people
{
long num;
char name[10];
enum gender sex;
char type[10];
int time;
char addr[20];
struct people *next;
}*person, *node;
课程设计要求:
⑴一律使用 person 定义个人结构体的变量,一律使用 node 定义指向个人结构体的指针变量
⑵程序运行过程中要有菜单提示,菜单如下:
⑶“Insert a people”:插入一个联系人记录,要求按平均分从高到低插入
⑷“Delete a people”:删除指定序号的联系人
⑸“显示通讯录”:输出链表中所有联系人的信息
⑹“分类显示”:输出链表中不同分类的联系人(亲友、同学、同事、好友)
⑺“Search a people by the name”:根据输入的姓名,输出链表中相应联系人的信息
⑻“按录入时间排序通讯录”:输出链表中按时间录入的所有联系人的信息
⑼“Exit the program”:销毁链表,结束程序运行
⑽要求程序首先自动插入若干个联系人记录到链表中
PPEOPLE insert(PPEOPLE head, PPEOPLE pe);
void main( )
{
PPEOPLE h, s;
int i;
//执行输入 语句 建立联系人通讯录
}
代码:
#include
#include
#include
enum gender {male, female};//枚举
typedef struct people
{
long num;
char name[10];
enum gender sex;
char type[10];
int time;
char addr[20];
struct people *next;
}*person, *node;
typedef struct node//*定义单链表结点类型*//
{
struct people data;
struct node *next;
}Node,*link;
void menu_select()
{
int i;
printf(
"\n\n\t***************************************************************\n");
printf("\t|* 1.Insert a people *");
printf("\t|* 2.Delete a people *");
peintf("\t|* 3.显示通讯录 *");
printf("\t|* 4.分类显示 *");
printf("\t|* 5.Search a people by the name *");
printf("\t|* 6.按录入时间排序通讯录 *");
printf("\t|* 0.Exit the program *");
printf(
"\t***************************************************************\n");
do
{
printf("\n\t请选择选项:");
scanf("%d",&i);
}
while(i<0||i>6)
return i;
}
void Insert a people(link L)//插入一个联系人记录,要求按平均分从高到低插入
{
int i;
Node *p,*q;
p=L;
while(L)
{
p=(Node*)malloc(sizeof(Node));//申请内存空间
if(!p)
{
printf("申请空间失败\n");
}
for(i=0;i<10;i++)
scanf("%d",&p->data.num);//输入序号
scanf("%c",&p->data.name);//输入姓名
scanf("%c",&p->data.type);//输入分类
scanf("%e",&p->data.gender);//输入性别
scanf("%d",&p->data.time);//输入时间
scanf("%c",&p->data.addr);//输入家庭住址
q->next=NULL;
p->next=p;
p=q;
}
void Delete a people(link L)//删除指定序号的联系人
{
int i;
Node *p,*q;
p=L;
q=p->next;
printf("请输入要删除联系人的序号:");
scanf("%d",&i);
while(p!=NULL)
{
if(p->data.num==i)
{
q->next=p->next;//删除节点
free(p);//将p节点空间释放
printf("删除成功!");
}
else
{
p=q;
q=p->next;
}
}
}
void xianshitongxunlu(link L)//输出链表中所有联系人的信息
{
Node *p;
while(p!=NULL)
{
printf("序号 姓名 性别 类别 录入时间 家庭住址\n");
printf("%d%8c%16e%21c%27d%35c",p->data.num,p->data.name,p->data.gender,p->data.type,p->data.time,p->data.addr);
p=p->next;
}
printf("\n");
}
void fenleixianshi(link L)//输出链表中不同分类的联系人(亲友、同学、同事、好友)
{
char i;
Node *p;
p=L;
printf("请输入查询联系人的分类:");
scanf("%c",&i);
while(p!=NULL)
{
if(p->data.type==i)
{
printf("序号 姓名 性别 类别 录入时间 家庭住址\n");
printf("%d%8c%16e%21c%27d%35c",p->data.num,p->data.name,p->data.gender,p->data.type,p->data.time,p->data.addr);
}
else
{
p=p->next;
}
}
void Search a people by the name(link L)//根据输入的姓名,输出链表中相应联系人的信息
{
char i;
Node *p;
p=L;
printf("请输入查询人姓名:");
scanf("%c",&i);
while(p!=NULL)
{
if(p->data.name==i)
{
printf("序号 姓名 性别 类别 录入时间 家庭住址\n");
printf("%d%8c%16c%21c%27d%35c",p->data.num,p->data.name,p->data.gender,p->data.type,p->data.time,p->data.addr);
}
else
{
p=p->next;
}
}
}
void shijianpaixu(link L)//输出链表中按时间录入的所有联系人的信息
{
NOde *p,*q;
int i,j,temp;
for(i = 0,i < 10,i++)
{
for(j = 0,j< 9-i,j++)
{
if(p->data.time > p->next->data.time)
{
q=p;
p=p->next;
p->next=q;
}
}
}
while(p!=NULL)
{
printf("序号 姓名 性别 类别 录入时间 家庭住址\n");
printf("%d%8c%16c%21c%27d%35c",p->data.num,p->data.name,p->data.gender,p->data.type,p->data.time,p->data.addr);
p=p->next;
}
printf("\n");
}
void Exit the program(link L)//销毁链表,结束程序运行
{
Node *p,*q;
p=L;
q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
PPEOPLE insert(PPEOPLE head, PPEOPLE pe);
void main()
{
PPEOPLE h, s;
int i;
struct people
Node *L;
int m;
L=(Node*)malloc(sizeof(Node));
switch(menu_select())
{
case 0:Exit the program(L);break;
case 1:Insert a people(L);break;
case 2:Delete a people(L);break;
case 3:xianshitongxunlu(L);break;
case 4:fenleixianshi(L);break;
case 5:Search a people by the name(L);break;
case 6:shijianpaixu(L);
}