Syins写的C++的小实验-链表

实验要求

  1. 对学生的基本信息用链表进行处理,基本信息包括:学号、姓名、性别、 年龄、C 语言的成绩。
  2. 要求:
    (1)建立链表,输入一个学生的基本信息,插入链表,插入要求为链表必 须按照学号从小到大的顺序进行排列。
    (2)可以在链表中删除某一学生的信息即输入一个学生的学号,查找到该 节点信息作删除。
    (3)用函数封装每一个操作。

首先,定义一个结构体:

struct xxx
{
    long long xh;//学号,不考虑存在非数字,还有我知道最大位数,别杠
    char xm[10],xb;//定义姓名,性别,这里只考虑最高4个中文字符作为姓名,性别用M来代表男,W来代表女,O来代表其他QAQ;
    int age,cyy;//年龄和c语言成绩
    struct xxx *next;//指向下一个
    struct xxx *last;//指向上一个
};

然后考虑到要求(3)
我们定义了
一个菜单
输入函数
删除函数
输出函数
退出函数
嗯,还有主函数

void menu();
void sr();
void sc();
void bs();
void exit();

先来看一下主函数

int main()
{
    int op;
    t=NULL;
    w=NULL;
    while(f){
        system("cls");//清空
        menu();
        bs();//输出函数
        cin>>op;
        switch(op)
        {
        case 1:
            cout<<"依次输入学号、姓名、性别、 年龄、C 语言的成绩"<<endl;
            sr();
            break;
        case 2:
            sc();
            break;
        case 3:
            exit();
            break;
        }
        system("pause");//暂停
    }
    return 0;
}

菜单在这里

void menu()
{//嗯,就是一串文字,增加交互能力
    cout<<"1:输入一个学生的基本信息"<<endl<<"2:输入一个学生的学号删除该学生的信息"<<endl<<"3:退出"<<endl;
    cout<<"如果要退出,请按3和回车键,不要点X!!!!!!!!!!!!!"<<endl;
    //链表采用动态分配,直接退出可能会存在安全隐患
}

输入函数

void sr()
{//确实有点长,但是主要是为了增加交互性,而且这里用的是双向链表,虽然有点多余
    struct xxx *p,*q;
    p=(struct xxx *)malloc(sizeof(struct xxx));
    cout<<"输入学号"<<endl;
    cin>>(p->xh);
    cout<<"输入姓名"<<endl;
    cin>>(p->xm);
    cout<<"输入性别"<<endl;
    cin>>(p->xb);
    cout<<"输入年龄"<<endl;
    cin>>(p->age);
    cout<<"输入c语言成绩"<<endl;
    cin>>(p->cyy);
    if(t==NULL){
        t=p;
        w=p;
        p->next=NULL;
        p->last=NULL;
    }
    else
    {
        q=t;
        if(p->cyy>q->cyy){
            p->next=q;
            t=p;
            q->last=p;
        }
        else{
            while(q->next!=NULL&&p->cyy<q->next->cyy)
                q=q->next;
            if(q->next!=NULL){
                q->next=p;
                q->last=p->last;
                p->last=q;
            }
            else{
                p->next=NULL;
                p->last=q;
                q->next=p;
                w=p;
            }
        }
    }
}

链表的实现过程可以看一下我之前的代码》点这里《

输出函数

void bs()
{
    int i=0;
    cout<<"--------------------------------------------------------------------------"<<endl;
    if(t==NULL)cout<<"暂无学生信息"<<endl;
    else{
        struct xxx *p;
        p=t;
        cout<<"名次:"<<++i<<"   "<<"学号:"<<p->xh<<"   "<<"姓名:"<<p->xm<<"   "<<"性别:"<<p->xb<<"   "<<"年龄:"<<p->age<<"   "<<"c语言成绩:"<<p->cyy<<endl;
        while(p->next!=NULL){
            cout<<"名次:"<<++i<<"   "<<"学号:"<<p->next->xh<<"   "<<"姓名:"<<p->next->xm<<"   "<<"性别:"<<p->next->xb<<"   "<<"年龄:"<<p->next->age<<"   "<<"c语言成绩:"<<p->next->cyy<<endl;
            p=p->next;
        }
    }
    cout<<"--------------------------------------------------------------------------"<<endl;
}

删除函数

void sc()
{
    if(t==NULL)cout<<"没有数据,你看不到吗???"<<endl;
    else
    {
        long long v;
        cout<<"输入要删除的学生的学号:"<<endl;
        cin>>v;
        struct xxx *p;
        p=t;
        if(p->xh==v){
            t=p->next;
            free(p);
        }
        else
        {
            while(p->next!=NULL&&(p->next->xh)!=v)
                p=p->next;
            if(p->next==NULL)cout<<"根本没有这个人"<<endl;
            else{
                if(p->next->next!=NULL)
                {
                    p->next->next->last=p;
                    p=p->next;
                    p->last->next=p->next;
                    free(p);
                }
                else{
                    p=p->next;
                    p->last->next=NULL;
                    free(p);//记得每次去节点的时候要释放空间
                }
            }
        }
    }
}

退出函数

void exit()//主要是为了清空所有动态申请的地址,释放空间
{
    if(t==NULL)f=0;
    else{
        struct xxx *p;
        p=t;
        while(p->next!=NULL)
        {
            t=t->next;
            free(p);
            p=t;
        }
        free(p);
        f=0;
    }
}

完整代码

#include<iostream>
#include<stdlib.h>
using namespace std;
struct xxx
{
    long long xh;
    char xm[10],xb;
    int age,cyy;
    struct xxx *next;
    struct xxx *last;
};
struct xxx *t;
struct xxx *w;
int f=1;
void menu();
void sr();
void sc();
void bs();
void exit();
int main()
{
    int op;
    t=NULL;
    w=NULL;
    while(f){
        system("cls");
        menu();
        bs();
        cin>>op;
        switch(op)
        {
        case 1:
            cout<<"依次输入学号、姓名、性别、 年龄、C 语言的成绩"<<endl;
            sr();
            break;
        case 2:
            sc();
            break;
        case 3:
            exit();
            break;
        }
        system("pause");
    }
    return 0;
}
void menu()
{
    cout<<"1:输入一个学生的基本信息"<<endl<<"2:输入一个学生的学号删除该学生的信息"<<endl<<"3:退出"<<endl;
    cout<<"如果要退出,请按3和回车键,不要点X!!!!!!!!!!!!!"<<endl;
}
void bs()
{
    int i=0;
    cout<<"--------------------------------------------------------------------------"<<endl;
    if(t==NULL)cout<<"暂无学生信息"<<endl;
    else{
        struct xxx *p;
        p=t;
        cout<<"名次:"<<++i<<"   "<<"学号:"<<p->xh<<"   "<<"姓名:"<<p->xm<<"   "<<"性别:"<<p->xb<<"   "<<"年龄:"<<p->age<<"   "<<"c语言成绩:"<<p->cyy<<endl;
        while(p->next!=NULL){
            cout<<"名次:"<<++i<<"   "<<"学号:"<<p->next->xh<<"   "<<"姓名:"<<p->next->xm<<"   "<<"性别:"<<p->next->xb<<"   "<<"年龄:"<<p->next->age<<"   "<<"c语言成绩:"<<p->next->cyy<<endl;
            p=p->next;
        }
    }
    cout<<"--------------------------------------------------------------------------"<<endl;
}
void sr()
{
    struct xxx *p,*q;
    p=(struct xxx *)malloc(sizeof(struct xxx));
    cout<<"输入学号"<<endl;
    cin>>(p->xh);
    cout<<"输入姓名"<<endl;
    cin>>(p->xm);
    cout<<"输入性别"<<endl;
    cin>>(p->xb);
    cout<<"输入年龄"<<endl;
    cin>>(p->age);
    cout<<"输入c语言成绩"<<endl;
    cin>>(p->cyy);
    if(t==NULL){
        t=p;
        w=p;
        p->next=NULL;
        p->last=NULL;
    }
    else
    {
        q=t;
        if(p->cyy>q->cyy){
            p->next=q;
            t=p;
            q->last=p;
        }
        else{
            while(q->next!=NULL&&p->cyy<q->next->cyy)
                q=q->next;
            if(q->next!=NULL){
                q->next=p;
                q->last=p->last;
                p->last=q;
            }
            else{
                p->next=NULL;
                p->last=q;
                q->next=p;
                w=p;
            }
        }
    }
}
void sc()
{
    if(t==NULL)cout<<"没有数据,你看不到吗???"<<endl;
    else
    {
        long long v;
        cout<<"输入要删除的学生的学号:"<<endl;
        cin>>v;
        struct xxx *p;
        p=t;
        if(p->xh==v){
            t=p->next;
            free(p);
        }
        else
        {
            while(p->next!=NULL&&(p->next->xh)!=v)
                p=p->next;
            if(p->next==NULL)cout<<"根本没有这个人"<<endl;
            else{
                if(p->next->next!=NULL)
                {
                    p->next->next->last=p;
                    p=p->next;
                    p->last->next=p->next;
                    free(p);
                }
                else{
                    p=p->next;
                    p->last->next=NULL;
                    free(p);
                }
            }
        }
    }
}
void exit()
{
    if(t==NULL)f=0;
    else{
        struct xxx *p;
        p=t;
        while(p->next!=NULL)
        {
            t=t->next;
            free(p);
            p=t;
        }
        free(p);
        f=0;
    }
}
发布了28 篇原创文章 · 获赞 107 · 访问量 1182
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章