C语言链表实现的控制台程序员信息管理系统

#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语言,花了两个半小时实现了一个简单的控制台程序员信息管理系统,但是这个程序有一个缺陷,就是输入不能非法的数据(不是很健壮),反正就是为了练习单向链表。这个程序实现了向链表中插入数据,在链表尾附加数据,删除节点(分情况讨论要删除的节点是不是表头),以及单向链表的遍历,有一定的参考价值。下一步准备实现单向链表的逆向输出,今晚木有时间了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值