链表的简单应用

学生管理系统

~简单功能介绍

  • 学生信息的添加
  • 信息的查找
  • 信息删除
  • 按输入顺序显示信息
  • 按学号排好序后显示所有信息
  • 将信息保存在文件中
  • 退出程序

~设计思路

添加

  • 判断链表中是否存在信息
  • 若无元素,则创建头节点,添加信息
  • 若有元素,则继续在链表尾部添加元素

查找

  • 按姓名查找
  • 按学号查找

删除学生信息

  • 按姓名删除
  • 按学号删除

显示全部信息

  • 即链表的遍历

按顺序打印所有信息

  • 先给链表排序
    然而博主在这个地方卡了一下,对于链表链表的排序,只需要在各节点之间来回交换数据信息,需要注意的是,这样就会使原链表成为了一个有序链表,要是想按刚开始输入顺序来输出链表就只能在这一步之前再建立一个链表,保存原链表的值;或者将原链表信息保存在文件中,再进行遍历(在这篇文章中博主没有建立那个链表)。

  • 再次遍历链表信息

将信息保存在文件

  • 创建文件再用简单的fprintf()函数将链表信息保存在了文件中

  • 接下来代码呈上:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
#define SEP "-------------------------------------------------------"
static int count=0;//定义静态全局变量计数
typedef struct student{
    int id;
    char name[N];
    struct student*next;
}Student,*pHead;
pHead Head=NULL;
Student* FindSteal();
void Create();
void PrintScr();
void Print();
Student*SearchName(char*name);
Student* SearchId(int id);
Student*SearchName_d(char*name);
Student* SearchId_d(int id);
void DeleteInfo();
void SearchInfo();
void SaveInfo();
void SortInfo();
void PrintSort(Student*S);
void Process();
int main(){
    PrintScr();//显示需求
    Process();//处理需求
}
Student* FindSteal(){//找尾部节点
    Student*pTemp;
    pTemp=Head->next;
    while(pTemp->next!=NULL){
        pTemp=pTemp->next;
        }
    return pTemp;
}
void Create(){//创建兼添加成员信息
    Student*pro,*p;
    if(count==0){//成员为零时创建头节点
            Head=(Student*)malloc(sizeof(Student));
            pro=Head;
        while(1){//用尾插法添加元素
             p=(Student*)malloc(sizeof(Student));
             printf("\tInput id(Input -1 to exit):");
             scanf("%d",&p->id);
            if(p->id==-1)break;
             printf("\tInput name:");
             scanf("%s",p->name);
            pro->next=p;
             p->next=NULL;
             pro=p;
        count++;
    }
    free(p);
    }
    else{//不为零时在尾部添加元素
        pro=FindSteal();
    while(1){
        p=(Student*)malloc(sizeof(Student));
        printf("\n\tInput id(Input -1 to exit):");
        scanf("%d",&p->id);
        if(p->id==-1)break;
        printf("\tInput name:");
        scanf("%s",p->name);
        pro->next=p;
        p->next=NULL;
        pro=p;
        count++;
        }   
    }
}
void PrintScr(){//打印功能列表,由于写这些代码时再LINUX里写的,直接用chnglish写了这些功能,但可以看懂的,哈哈
    printf("\t");
    printf(SEP);
    printf("\n");
    printf("\t|*************Student Management System***************|\n");
    printf("\t|*\t1.Add StudentInfo\t2.Search student     *|\t\n");
    printf("\t|*\t2.Delete StudentInfo\t4.Show AllStudentInfo*|     \n");
    printf("\t|*\t5.Show SortedInfo\t6.Save Info\t     *|\n");
    printf("\t|*\t7.Exit                                       *|\n");
    printf("\t");
    printf(SEP);
    printf("\n");
}
void Print(){//遍历链表
    Student*pTemp;
    pTemp=Head->next;
    while(pTemp!=NULL){
        printf("\n\tid:");
        printf("%d\n",pTemp->id);
        printf("\tname:%s\n",pTemp->name);
        pTemp=pTemp->next;
        }
    }
Student*SearchName(char*name){//按学生姓名查找详细信息
    Student*pTemp;
    pTemp=Head->next;
    int flag=0;
    while(pTemp!=NULL){
       if(strcmp(pTemp->name,name)==0){
            flag=1;
            break;
       }
       pTemp=pTemp->next;
    }
    if(flag=0){
        printf("\n\tNo this Member!\n");
        return Head;
        }
    return pTemp;
    }
Student*SearchName_d(char*name){//查找要找的学生的前一个学生的节点,后面删除和添加用
    Student*pTemp,*pro;
    pTemp=Head->next;
    pro=Head;
    int flag=0;
    while(pTemp!=NULL){
        if(strcmp(pTemp->name,name)==0){
             flag=1;
             break;
                   }
         pro=Head;
         pTemp=pTemp->next;
                }
        if(flag=0){
            printf("\n\tNo this Member!\n");
            return Head;
             }
          return pro;
            }                 
Student* SearchId(int id){//按学号id查找
    Student*pTemp;
    pTemp=Head->next;
    int flag=0;
    while(pTemp!=NULL){
        if(pTemp->id==id){
            flag=1;
            break;
        }
        }
        if(flag==0)
        {
        printf("\tNo this member!\n");
        return Head;
        }
    return pTemp;
    }

Student* SearchId_d(int id){//查找该学生的前一个学生节点
    Student*pTemp,*pro;
    pTemp=Head->next;
    int flag=0;
    pro=Head;
    while(pTemp!=NULL){
        if(pTemp->id==id){
            flag=1;
            break;
        }
    pro=pTemp;
    pTemp=pTemp->next;
        }
        if(flag==0)
        {
        printf("\tNo this member!\n");
        return Head;
        }
    return pro;
    }
void SearchInfo(){//查找学生信息
    printf("\t1.Search with id 2.Search with name");
    int s;
    Student*pTemp;
    char name[N];
    int id;
    printf("\n\tplease input: ");
    scanf("%d",&s);
    switch(s){
        case 2:
            printf("\n\tInput name:");
            scanf("%s",name);
            pTemp=SearchName(name);
             printf("\n\tThe Member Info: id:%d     name:%s\n",pTemp->id,pTemp->name);
            break;
        case 1:
            printf("\n\tInput id:");
            scanf("%d",&id);
            pTemp=SearchId(id);
             printf("\n\tThe Member Info: id:%d     name:%s\n",pTemp->id,pTemp->name);
            break;
        default:
            break;
    }
}

void DeleteInfo(){//删除学生信息
    printf("\n\t1.Delete  InputId 2.Delete  InputName\n");
    int s;
    int id;
    Student*p;
    Student*pTemp;
    char name[N];
    printf("\tInput choice:");
    scanf("%d",&s);
    switch(s){
        case 1:
            printf("\tInput id:");
            scanf("%d",&id);
            pTemp=SearchId_d(id);
        p=pTemp->next;
        break;
    case 2:
        printf("\tInput name:");
        scanf("%s",name);
        pTemp=SearchName_d(name);
        break;
    default:
        break;
    }
    if(p->next==NULL){
        pTemp->next=NULL;
        free(p);
            }
    else{
        pTemp->next=p->next;
        p->next=NULL;
        free(p);
        }
    count--;
}
void SaveInfo(){//保存学生信息大到文件中
    FILE*fp;
    Student*pTemp=Head->next;
    fp=fopen("students.txt","wt");
    if(fp==NULL){
        printf("\n\tCan't create file\n");  
    }
    else{
        while(pTemp!=NULL){
            fprintf(fp,"%-10d%-20s\n",pTemp->id,pTemp->name);
            pTemp=pTemp->next;
        }   
    }
    printf("\n\tWrite in the file succeed!\n");
    fclose(fp);
}

void SortInfo(){//给学生按照学号排序
    if(Head==NULL)printf("\n\tNo member!Please input members!\n");
    else{
    Student*pTemp,*pro,*p;
    pro=(Student*)malloc(sizeof(Student));
    pTemp=Head->next;
    while(pTemp!=NULL){
        p=pTemp->next;
        while(p!=NULL){
            if(pTemp->id>p->id){
                pro->id=pTemp->id;
                strcpy(pro->name,pTemp->name);
                pTemp->id=p->id;
                strcpy(pTemp->name,p->name);
                p->id=pro->id;
                strcpy(p->name,pro->name);
            }   
            p=p->next;
        }
        pTemp=pTemp->next;
    }   
    free(pTemp);
    }
}
void PrintSort(Student*S){//打印排序后的学生信息
    Student*pTemp;
    pTemp=S;
    while(pTemp!=NULL){
        printf("\n\tid:%d    name:%s",pTemp->id,pTemp->name);
        pTemp=pTemp->next;
    }
    }
void Process(){//用户命令处理
    int com;
    Student*S;
    printf("\tInput process command:");
    scanf("%d",&com);
    while(1){
        switch(com){
            case 1:
                Create();
                break;
            case 2:
               SearchInfo();
                break;
            case 3:
                DeleteInfo();
                break;
            case 4:
        Print();
                break;
            case 5:
        SortInfo();
        Print();         
                break;
            case 6:
        SaveInfo();
                break;
            case 7:
                exit(1);
            default:
                printf("\n\tNo this choice!\n");
                break;
        }
        printf("\tInput process choice:");
        scanf("%d",&com);
    }
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值