iOS開發 ----- C小型學生信息管理系統,單向鏈表

關於C結構體和單向鏈表的一個小demo

完全是命令行的,估計大二的時候會讓寫一個關於鏈表和結構體的東西,這裏記錄一下,之前寫過一個雙向循環鏈表的,這裏就不貼了,原理都差不多,多了一個指針而已

邏輯是最重要的,邏輯是重要的,邏輯是重要的,重要的事要說三遍,還要用個大字體

程序界面

完全的命令行模式,開始會讓先輸入4個人的信息,姓名,地址,電話,年齡,爲了程序的美觀,儘量不要輸入中文,排版字符佔位不一樣

文件讀寫,以及字符串的分割,另一篇博客

後邊又寫了一篇文章把文件存儲添加上去了,需要的,點我

廢話不多說,貼代碼

/*************************************************************************
    > File Name: studyManager.c
    > Author: xiao333ma
    > Mail: [email protected] 
    > 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是基礎,好好學吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章