iOS开发 ----- C小型学生信息管理系统,单向链表

关于C结构体和单向链表的一个小demo

完全是命令行的,估计大二的时候会让写一个关于链表和结构体的东西,这里记录一下,之前写过一个双向循环链表的,这里就不贴了,原理都差不多,多了一个指针而已

逻辑是最重要的,逻辑是重要的,逻辑是重要的,重要的事要说三遍,还要用个大字体

程序界面

完全的命令行模式,开始会让先输入4个人的信息,姓名,地址,电话,年龄,为了程序的美观,尽量不要输入中文,排版字符占位不一样
文件读写,以及字符串的分割,另一篇博客
后边又写了一篇文章把文件存储添加上去了,需要的,点我

废话不多说,贴代码

/*************************************************************************
    > File Name: studyManager.c
    > Author: xiao333ma
    > Mail: xiao3333ma@gmail.com 
    > Created Time: 一  7/20 09:29:02 2015
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
//定义结构体
typedef struct studentInfor
{
    char name[20];
    int age;
    char address[50];
    char phoneNumber[11];
    struct studentInfor  *next;
}SI;
//输出函数,传入结构体类型指针
void printfInfor(SI * listHead)
{
    SI *p =(SI *)malloc (sizeof(SI));
    p=listHead;
    printf("姓名                年龄      地址                                                        联系方式\n");
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%-20s%-10d%-60s%-11s\n",p->name,p->age,p->address,p->phoneNumber);
    }
}
//输入信息的自定义函数,返回一个结构体指针,方便多次调用
SI* inputInfor()
{
    SI *node=(SI *) malloc ( sizeof(SI) );
    char name[20];
    char address[50];
    char phoneNumber[11];
    int age=0;
    if( node != NULL)
    {
        while(1)
        {
            printf("请输入姓名,20位以内\n");
            scanf("%s",name);
            getchar();
            if(strlen(name)<20)
            {
                strcpy( node->name , name);
                break;
            }else
                printf("输入的位数不符合要求");
        }
        while(1)
        {
            printf("请输入地址,50位以内\n");
            scanf("%s",address);
            getchar();
            if(strlen(address)<50)
            {
                strcpy( node->address , address);
                break;
            }else
                printf("输入的位数不符合要求");
        }
        while(1)
        {
            printf("请输入电话号码,11位\n");
            scanf("%s",phoneNumber);
            getchar();
            if(strlen(phoneNumber)<11)
            {
                strcpy( node->phoneNumber , phoneNumber);
                break;
            }else
                printf("输入的位数不符合要求");
        }
        printf("请输入年龄\n");
        scanf("%d",&age);
        getchar();
        if(age>150)
        {
            printf("年龄太大,不符合要求\n");

        }
        node->age=age;
        node->next=NULL;
    }
    return node;
}

//添加学生信息,传入接头体头指针,然后在后边追加
void addInfor(SI *listHead)
{
    SI *p=(SI *)malloc (sizeof(SI));
    p=listHead;
    SI *newNode=(SI *)malloc(sizeof(SI));
    newNode=inputInfor();//返回正常
    while(p->next!=NULL)
    {
        p=p->next;
    }
    if(p->next==NULL)
        p->next=newNode;
    newNode->next=NULL;
    //调用打印函数,打印链表内容
    printfInfor(listHead);
}
//搜索,删除,修改函数,
//参数说明
//1.结构体头指针
//2.要搜索,删除,或者修改的函数
//3.是否要删除 1为删除,其他无效
//4.是否要修改 1为修改,其他无效
int  searchInfor(SI *listHead , char *name,int isDel,int isModify)
{
    SI *p=(SI *)malloc (sizeof(SI));
    p=listHead;
    SI *q=(SI *)malloc (sizeof(SI));
    while(p->next!=NULL)
    {
        q=p;
        p=p->next;
        if(strcmp(p->name,name)==0)
        {
            printf("找到相应联系人\n\n");
            printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
            if(isModify == 1)
            {

                SI *modify=(SI *)malloc(sizeof(SI));
                modify=inputInfor();
                strcpy(p->name,modify->name);
                strcpy(p->address,modify->address);
                strcpy(p->phoneNumber,modify->phoneNumber);
                p->age=modify->age;
                printf("修改为\n");
                free(modify);
                printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
            //  printfInfor(listHead);
                return 1;
            }
            if(isDel==1)//如果是真的话,就删除该元素
            {
                printf("是否真的要删除这条信息[Y/N]");
                char a;
                scanf("%c",&a);
                getchar();
                if(a=='Y')
                {
                    q->next=p->next;
                    p=q->next;
                    printfInfor(listHead);
                    return 1;
                }
            }
            return 1;
        }
    }
    if(p->next==NULL)
    {
        if(strcmp(p->name,name)==0)
        {
            printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
            if(isModify == 1)
            {
                SI *modify1=(SI *)malloc(sizeof(SI));
                modify1=inputInfor();
                strcpy(p->name,modify1->name);
                strcpy(p->address,modify1->address);
                strcpy(p->phoneNumber,modify1->phoneNumber);
                p->age=modify1->age;
                free(modify1);
                p->next=NULL;
                printfInfor(listHead);
                return 1;
            }
            if(isDel==1)
            {
                printf("是否真的要删除这条信息[Y/N]");
                char a;
                scanf("%c",&a);
                getchar();
                if(a=='Y')
                {
                    q->next=NULL;
                    printfInfor(listHead);
                    return 1;
                }

            }
            return 1;
        }
    }



    return -1;

}


//main函数
int main(int argc,const char *argv[])
{

    SI *list=(SI *)malloc(sizeof(SI));
    //int listLength=0;
    if(list == NULL)
    {
        return 0;
    }
    //程序运行的时候先输入几个人的信息 大家也可以用fgets从文件中读取,方便一点,这里就不加这个模块了,大家可以自行编写 
    char name[20];
    list->next=NULL;
        printf("为使系统正常工作,请先添加4个人员\n");
        addInfor(list);
        addInfor(list);
        addInfor(list);
        addInfor(list);
    while(1)
    {
        printf("\n\n");
        printf("***********************************************************\n");
        printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
        printf("菜单列表:\n");
        printf("1:添加信息\n");
        printf("2:修改信息\n");
        printf("3:删除信息\n");
        printf("4:查询信息\n");
        printf("5:退出\n");
        printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
        printf("***********************************************************\n\n");
        printf("请输入选项:\n");
        int a=0;
        scanf("%d",&a);
        getchar();
        switch(a)
        {
            case 1:
                addInfor(list);break;
            case 2:
                printf("请输入要修改的名字:");
                scanf("%s",name);
                getchar();
                if(searchInfor(list,name,0,1)==-1)
                {
                    printf("没有相关人员,请确认后在修改\n");
                }
                printfInfor(list);
                break;
            case 3:
                printf("请输入要删除的名字:");
                scanf("%s",name);
                getchar();
                if(searchInfor(list,name,1,0)==-1)
                {
                        printf("没有相关信息,无法删除\n");
                }
                break;
            case 4:
                printf("请输入要查找的名字:");
                scanf("%s",name);
                getchar();
                if(searchInfor(list,name,0,0)==-1)
                {
                    printf("没有找到相关人员,请确认后查找\n");
                }
                break;
            case 5:
                return 0;
                break;



        }
    }
    return 0;

}

大概就这么多了,关于双向循环链表的话,道理是一样的,多一个指针,而且搜索查询要快一点,毕竟是从两端开始查询的,大家可以自己编写,这里就不赘述了.

这里没有对内存做释放,虽然可以运行,但还是有瑕疵的,大家可以修改下

毕竟C是基础,好好学吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值