#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct NODE
{
char name[30];
int age;
char gender;
char best[20];
struct NODE *next;
}node,*Linklist;
void get_element(char name[],int *age,char *gender,char best[],int count)
{
printf("请输入第%d个程序员的名字:",count);
scanf("%s",name);
printf("请输入第%d个程序员的年龄:",count);
scanf("%d",age);
getchar();
printf("请输入第%d个程序员的性别:",count);
scanf("%c",gender);
printf("请输入第%d个程序员最擅长的编程语言:",count);
scanf("%s",best);
}
Linklist build_linklist(int n)
{
Linklist r,p,head=NULL;
char tname[30];
int tage;
char tgender;
char tbest[20];
int i;
for (i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(node));
get_element(tname,&tage,&tgender,tbest,i+1);
strcpy(p->name,tname);
p->age=tage;
p->gender=tgender;
strcpy(p->best,tbest);
p->next=NULL;
if (!head)
head=p;
else
r->next=p;
r=p;
}
return head;
}
int insert_at_last(Linklist head)
{
if (!head)
{
printf("请先创建链表!");
return 1;
}
Linklist p,r=head;
while(r->next!=NULL)
r=r->next;
char tname[30];
int tage;
char tgender;
char tbest[20];
int i,n;
printf("请输入要增加的程序员的人数:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(node));
get_element(tname,&tage,&tgender,tbest,i+1);
strcpy(p->name,tname);
p->age=tage;
p->gender=tgender;
strcpy(p->best,tbest);
p->next=NULL;
r->next=p;
r=p;
}
return 0;
}
int search_person(Linklist head,char aname[])
{
if (!head)
{
printf("请先创建链表!");
return 1;
}
Linklist r;
int flag=0;
for(r=head;r!=NULL;r=r->next)
if (!strcmp(aname,r->name))
{
printf("该程序员的信息为:\n");
printf("姓名:%s ",r->name);
printf("年龄:%d ",r->age);
printf("性别:%c ",r->gender);
printf("最擅长的语言:%s\n",r->best);
flag=1;
break;
}
if (!flag)
{
printf("没有相关程序员的信息!\n");
return 1;
}
return 0;
}
int insert_at_random_position(Linklist head,char aname[])
{
if (!head)
{
printf("请先创建链表!");
return 1;
}
Linklist p,r;
char tname[30];
int tage;
char tgender;
char tbest[20];
int flag=0;
for(r=head;r!=NULL;r=r->next)
if (!strcmp(aname,r->name))
{
get_element(tname,&tage,&tgender,tbest,0);
p=(Linklist)malloc(sizeof(node));
strcpy(p->name,tname);
p->age=tage;
p->gender=tgender;
strcpy(p->best,tbest);
p->next=r->next;
r->next=p;
flag=1;
break;
}
if (!flag)
{
printf("没有相关程序员的信息!\n");
return 1;
}
return 0;
}
int delete_person(Linklist *head,char aname[])
{
if (!(*head))
{
printf("请先创建链表!\n\n");
return 0;
}
Linklist p,r;
int flag=0;
for (r=*head;r!=NULL;r=r->next)
{
if ((!strcmp(aname,r->name))&&(r==*head))
{
(*head)=(*head)->next;
flag=1;
break;
}
if (!strcmp(aname,r->name))
{
for (p=*head;p!=NULL;p=p->next)
{
if (p->next==r)
{
p->next=r->next;
break;
}
}
flag=1;
break;
}
}
if (!flag)
{
printf("没有相关程序员的信息!\n");
return 1;
}
return 0;
}
int display_all(Linklist head)
{
if (!head)
{
printf("请先创建链表!\n\n");
return 1;
}
Linklist r;
for (r=head;r!=NULL;r=r->next)
printf("%s %d %c %s\n",r->name,r->age,r->gender,r->best);
return 0;
}
int main()
{
printf("控制台程序员管理系统\n");
Linklist head=NULL;
int n,icount;
char name[30];
while (1)
{
printf("请选择:\n1.建立链表\n2.附加人员\n3.插入人员\n4.删除人员\n5.查找某人\n6.显示所有人员\n0.退出\n");
scanf("%d",&n);
switch (n)
{
case 1:
{
printf("输入人数:");
scanf("%d",&icount);
head=build_linklist(icount);
printf("链表创建成功!\n\n");
break;
}
case 2:
{
if(!insert_at_last(head))
printf("附加成功!\n\n");
break;
}
case 3:
{
printf("要在某人后面插入新的人员,请输入该人的姓名;");
scanf("%s",name);
if(!insert_at_random_position(head,name))
printf("插入成功!\n\n");
break;
}
case 4:
{
printf("要删除某人,请输入该人的姓名;");
scanf("%s",name);
if(!delete_person(&head,name))
printf("删除成功!\n\n");
break;
}
case 5:
{
printf("要查找某人,请输入该人的姓名;");
scanf("%s",name);
search_person(head,name);
break;
}
case 6:
{
display_all(head);
break;
}
case 0:
{
exit(0);
}
default:
{
printf("输入有误!!!!");
}
}
}
return 0;
}
正在学数据结构与算法,为了练习单向线性表的链式实现,我用C语言,花了两个半小时实现了一个简单的控制台程序员信息管理系统,但是这个程序有一个缺陷,就是输入不能非法的数据(不是很健壮),反正就是为了练习单向链表。这个程序实现了向链表中插入数据,在链表尾附加数据,删除节点(分情况讨论要删除的节点是不是表头),以及单向链表的遍历,有一定的参考价值。下一步准备实现单向链表的逆向输出,今晚木有时间了。